用 cfront 来测试。
t.h
#ifndef t_h
#define t_h
#include <stdio.h>
class Base
{
public:
Base()
{
printf("Base ctor\n");
num_ = 5;
}
~Base()
{
printf("Base dtor\n");
}
int get_num();
private:
int num_;
};
class D1 : public Base
{
public:
D1()
{
printf("D1 ctor\n");
a_ = 12;
}
~D1()
{
printf("D1 dtor\n");
}
private:
int a_;
};
class D2 : public Base
{
public:
D2()
{
printf("D2 ctor\n");
b_ = 78;
}
~D2()
{
printf("D2 dtor\n");
}
private:
int b_;
};
#endif
t.C
#include "t.h"
int Base::get_num()
{
return num_;
}
m.C
#include "t.h"
int main(int argc, char *argv[])
{
D1 d1;
D2 d2;
printf("d1.num: %d\n", d1.get_num());
printf("d2.num: %d\n", d1.get_num());
return 0;
}
编译指令
main_fn=t
cpp-5 -Iincl-master/incl-linux32/ $main_fn.C > $main_fn.i # 处理 header files
./cfront +a1 +L +f$main_fn.C < $main_fn.i > $main_fn..c # 将 cpp 档 (.C) 转成
.c 档
main_fn=m
cpp-5 -Iincl-master/incl-linux32/ $main_fn.C > $main_fn.i # 处理 header files
./cfront +a1 +L +f$main_fn.C < $main_fn.i > $main_fn..c
gcc-5 m..c t..c m.cdts..c ./libC.a -o m2
执行结果
./m2
Base ctor
D1 ctor
Base ctor
D2 ctor
d1.num: 5
d2.num: 5
D2 dtor
Base dtor
D1 dtor
Base dtor
好奇测试了一下, 不算太难, 连 ctor/dtor 都送给你了。
只是转出的 ..c code 超级难看就是, 但用 macro 自己来, 应该也不会简单到哪里。
应付最基本的继承语法应该是绰绰有余。
用 c89 应该也是没问题。
※ 引述《DJWS (...)》之铭言:
: // C99
: struct SuperClass {
: int num;
: };
: struct ClassA {
: int num;
: int a;
: };
: struct ClassB {
: int num;
: int b;
: };
: struct ClassA objA = {
: .num = 0,
: .a = 0
: };
: struct ClassB objB = {
: .num = 0,
: .b = 0
: };
: void func(void* obj)
: {
: struct SuperClass* object = obj;
: object->num++;
: }
: int main(void) {
: func(&objA);
: func(&objB);
: return 0;
: }
: 我想做类似的事情,请问在C99要怎么写?
: 不能使用malloc