
ooc-gcc
An easy to use Template to write OO program with pure C !
latest version 0.22
英文比较挫,有些时候会漏打多打几个字母,比如wiki页里面就有,大家凑合看,就当找彩蛋
建议下载打包好的压缩包,因为最后的版本懒得用svn传了,囧
这不是C++,这是C!
如果你用过GObject,就知道那个的繁琐和这个的简洁了
这里的NEW,DELETE都是大写的,是宏!
下文中大写的如下一些都是宏!
CLASS,STATIC,ASM
CLASS_EX,STATIC_EX,ASM_EX
NEW,NEW0,DELETE,DELETE0,ST
How to Compile 如何编译
e.g. "gcc OODbg.c test_Animals.c
"
上面加入OODbg.c文件的编译,可以提供内存分配的日志记录等功能,方便调试
同时可配合graphviz绘制函数调用图表
Simple Cat/Dog Example
一个简单的用于描述继承关系的例子
这是用C语言配合OOC-GCC中定义的宏完成的
更多例子打的包中有,wiki中有一些
比较复杂的例子可以看那个简单解释器的例子
``` //引入宏模板 //该模板纯粹靠C语言提供的宏扩展实现,并且不引入任何一个全局变量! //足以保证使用上的方便与灵活
include "OOStd.h"
//类的定义 CLASS(Animal){ char *name; //声明公有区域,节约内存 STATIC(Animal); //声明函数指针,STATIC宏保证了多个实例共享一块公有区域的内存 //vFn是对一种函数指针的类型重定义,配合OOC-GCC其它宏使用才有意义 vFn talk; }; //构造函数的定义 static int Animal_load(Animal *THIS,void *name){ THIS->name=name; return 0; } //绑定构造函数 ASM(Animal,Animal_load,NULL,NULL,NULL)
//声明带有继承关系的类 CLASS_EX(Cat,Animal){ //Cat类仅继承Animal类,并未进行扩展 STATIC_EX(Cat,Animal); }; static void Meow(Animal *THIS){ printf("Meow!My name is %s!\n",THIS->name); } //声明公有区域的构造函数 static int Cat_loadSt(StAnimal *THIS,void *PARAM){ THIS->talk=(void *)Meow; return 0; } //绑定构造函数,会自动的按顺序调用子类和父类的构造和析构函数 //这也是该模板最方便的地方之一 ASM_EX(Cat,Animal,NULL,NULL,Cat_loadSt,NULL)
CLASS_EX(Dog,Animal){ STATIC_EX(Dog,Animal); }; static void Woof(Animal *THIS){ printf("Woof!My name is %s!\n",THIS->name); } static int Dog_loadSt(StAnimal *THIS,void *PARAM){ THIS->talk=(void *)Woof; return 0; } ASM_EX(Dog,Animal,NULL,NULL,Dog_loadSt,NULL)
int main(){ Animal *animals[4000]; StAnimal *f; int i=0; for(i=0;i<4000;i++) { //关键字和C++提供的类似 //实例占用的内存每次都会分配,公有区域的内存只会没有该实例的时候分配 if(i%2==0) animals[i]=NEW(Dog,"Jack"); else animals[i]=NEW(Cat,"Lily"); }; //方法存放在公有区域,通过 f=ST(animals[0]); for(i=0;i<4000;++i){ f->talk(animals[i]); } for(i=0;i<4000;++i){ //无需知道传入指针传入的指针指向的堆内存为何种类型 //都会调用正确的析构函数 //这里会根据实际情况调用Cat或Dog的析构函数 //实例区域的内存会被销毁,如果是最后的一个实例被销毁, //则会自动销毁静态区域的内存 DELETE0(animals[i]); } return 0; } ```
the same thing done in C++
和C++进行对比
```
include
using namespace std;
class Animal { public: Animal(const char* name) : name(name) {} virtual void talk() = 0; const char * name; };
class Cat : public Animal { public: Cat(const char* name) : Animal(name) {} void talk() { cout<<"Meow!Myname is "<
class Dog : public Animal { public: Dog(const char* name) : Animal(name) {} void talk() { cout<<"Woof!Myname is "<talk(); } for(int i = 0; i < 4000; i++){ delete animals[i]; } return 0; } ```
if the compiler support closure,use the code below
如果编译器支持闭包,会更像C++
```
include "OOStd.h"
CLASS(Animal){ char *name; STATIC(Animal); vFn talk; }; static int Animal_load(Animal *THIS,void *name){ THIS->name=name; return 0; } ASM(Animal,Animal_load,NULL,NULL,NULL)
CLASS_EX(Cat,Animal){ STATIC_EX(Cat,Animal); }; static int Cat_loadSt(StAnimal *THIS,void *PARAM){ void Meow(Animal *THIS){ printf("Meow!My name is %s!\n",THIS->name); } THIS->talk=(void *)Meow; return 0; } ASM_EX(Cat,Animal,NULL,NULL,Cat_loadSt,NULL)
CLASS_EX(Dog,Animal){ STATIC_EX(Dog,Animal); }; static int Dog_loadSt(StAnimal *THIS,void *PARAM){ void Woof(Animal *THIS){ printf("Woof!My name is %s!\n",THIS->name); } THIS->talk=(void *)Woof; return 0; } ASM_EX(Dog,Animal,NULL,NULL,Dog_loadSt,NULL)
int main(){ Animal *animals[4000]; StAnimal *f; int i=0; for(i=0;i<4000;i++) { if(i%2==0) animals[i]=NEW(Dog,"Jack"); else animals[i]=NEW(Cat,"Lily"); }; f=ST(animals[0]); for(i=0;i<4000;++i){ f->talk(animals[i]); } for(i=0;i<4000;++i){ DELETE0(animals[i]); } return 0; } ```