这个代码是修改自lwoopc,截取其中一部分,然后添加一部分。
在VC6.0和gcc可编译,大家可以从程序代码中的"//文件开始部分"开始看
CTOR是构造,DTOR是析构
- #include <stdio.h>
- #include <malloc.h>
- #define CLASS(type) \
- typedef struct type type; \
- type* type##_new( ); \
- void type##_ctor(type* t); \
- void type##_dtor(type* t); \
- void type##_delete(type* t); \
- struct type
- #define CTOR(type,sencentes) \
- type* type##_new() { \
- struct type *cthis; \
- cthis = (struct type*)malloc(sizeof(struct type)); \
- if(!cthis) \
- { \
- return 0; \
- } \
- type##_ctor(cthis); \
- return cthis; \
- } \
- \
- void type##_ctor(type* cthis) {sencentes;}
- #define DTOR(type,sencentes) \
- void type##_delete(type* cthis) \
- { \
- type##_dtor(cthis); \
- free(cthis); \
- } \
- void type##_dtor(type* cthis){sencentes;}
- #define SET(name,value) ( cthis -> name ) = (value)
- #define FUN(retType,funName) retType(* funName)
- #define CONNECT(funName) ( cthis -> funName ) = (& _##funName)
- #define INCALL(funName) (* cthis->funName) //在成员函数内调用其他函数
- #define CALL(this,funName) (* this->funName)
- //文件开始部分
- void _coutSome(char * str) //在原来函数名前加上_,和CONNECT宏相关
- {
- printf("%s\n",str);
- }
- //haha 类
- CLASS(haha){ //声明type##_new()和type##_ctor() 和 type##_delete()和type##_dtor() 函数
- #define MEMhaha int a; \
- int b;
- FUN(void,coutSome)(); //没定义在MEMhaha里面,表示自己专用的
- MEMhaha
- };
- CTOR(haha,SET(a,10);
- SET(b,5);
- CONNECT(coutSome)) //定义type##_new()和type##_ctor()函数 括号内第二个参数中的语句用;号隔开
- DTOR(haha,SET(a,0);
- INCALL(coutSome) ("dtoring..."))//定义type##_delete()和type##_dtor()函数 括号内第二个参数中的语句用;号隔开
- //wuwu 类,只有部分成员继承于haha,构造和析构等不继承,因为担心内存地址错误【继承后的排布不同】
- CLASS(wuwu){
- #define MEMwuwu MEMhaha \
- char c;
- MEMwuwu
- };
- CTOR(wuwu, printf("I am ctoring...\n");
- SET(a,10);
- SET(c,'w') ) //语句用;号隔开
- DTOR(wuwu, printf("I am dtoring...\n");
- SET(a,0) ;
- SET(c,'?') )
- //erer 类,和wuwu一模一样,但是本身只是把wuwu中的成员链接过来
- CLASS(erer) {
- #define MEMerer
- MEMwuwu
- };
- CTOR(erer, printf("I am ctoring...\n");
- SET(a,10);
- SET(c,'w') ) //语句用;号隔开
- DTOR(erer, printf("I am dtoring...\n");
- SET(a,0) ;
- SET(c,'?') )
- void main()
- {
- // 需要自己new和delete哦,C语言只能先定义后使用,所以下面几行必须放在最开始
- wuwu *w;
- haha *h;
- erer *e;
- printf("\n\n\n");
- h = haha_new();
- CALL(h,coutSome)("newed");
- printf("new:%d\n",h->a);
- printf("new:%d\n",h->b);
- h->a = 100;
- printf("set value:%d\n",h->a);
- haha_delete(h); //test
- printf("delete:%d\n",h->a); //test
- printf("\n\n\n");
- w = wuwu_new(); //继承
- printf("new:%d\n",w->a);
- printf("new:%c\n",w->c);
- w->a = 100;
- w->c = 'c';
- printf("set value:%d\n",w->a);
- printf("set value:%c\n",w->c);
- wuwu_delete(w); //test,这个正常情况下不被调用
- printf("dtor:%d\n",w->a);
- printf("dtor:%c\n",w->c);
- printf("\n\n\n");
- e = erer_new();
- printf("new:%d\n",e->a);
- printf("new:%c\n",e->c);
- e->a = 100;
- e->c = 'c';
- printf("set value:%d\n",e->a);
- printf("set value:%c\n",e->c);
- erer_delete(e);
- printf("dtor:%d\n",e->a); //test
- printf("dtor:%c\n",e->c);
- printf("\n\n\n");
- }