보통 객체지향 프로그래밍에는 C보다 C++가 낫다는 게 정설이다. 뭐 C로도 GObject 같은 걸로 객체지향 프로그래밍하는 삽질을 하는 사람들이 있긴 하다. 하지만 C++의 복잡도는 프로그래밍 언어의 구현 자체를 어렵게 하고 별도의 런타임 라이브러리가 필요하다는 큰 문제가 있고, 이미 수많은 컴파일러가 사용 가능한 C의 구현을 그대로 쓰기도 힘들다는 (C++는 별도의 ABI를 보통 필요로 하므로) 문제도 있다.
C+는 이런 문제를 C 문법에 C++와 비슷하게 사용할 수 있는 일부 기능을 넣은 thin wrapper를 만들어서 풀려고 한다. (TODO)
struct
를 클래스 등을 담을 수 있도록 확장한다.
구조체 안에, 실제로는 구조체에 포함되지 않는 상수 필드들을 넣을 수 있게 한다.
struct stream {
FILE *fp;
void (* const write)(struct stream *stream, const char *p) = &stream_write;
};
_
같은 걸 붙여서 사용할 것.자기 자신을 첫 인자로 받는 메소드를 위한 별도의 문법을 만든다. 이건 상수 필드로 선언 되지 않은, 일종의 virtual method에도 적용 가능하다.
// same to stream->write(stream, "foo");
stream..write("foo");
구조체의 맨 앞에 있는 구조체는 단일 상속을 구현하는 데 사용하며, 이 안에 있는 필드는 바깥에서도 사용 가능하다. 이건 이미 C99에서도 “이런 식으로 해야 한다”라고 규정한 바 있다.
struct flushable_stream {
struct stream base;
void (* const flush)(struct flushable_stream *stream) = &stream_flush;
};
struct flushable_stream *stream = ...;
stream..write("foo"); // stream->base.write(&stream->base, "foo");
stream..flush(); // stream->flush(stream);
finally
와 비슷하게 동작한다.
문법은 대략 다음과 같음.
int floor_log_factorial(int x) {
if (x < 0) return INT_MIN;
struct bignum *x0 = create_bignum_from_int(x);
finally x0..free();
x0..factorial();
x0..log();
return x0..floor_as_int();
}