1 Star 0 Fork 1

hunt/libcobject

forked from wkun/libcobject 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
cobject.h 2.26 KB
一键复制 编辑 原始数据 按行查看 历史
wkun 提交于 2020-08-26 10:49 +08:00 . 面向对象的c实现初始代码
#ifndef _COBJECT_H_
#define _COBJECT_H_
#define COBJECT_MAJOR_VERSION 1
#define COBJECT_MINOR_VERSION 0
#define COBJECT_MICRO_VERSION 0
/* 编程思想之一:尽可能不影响C编码风格基础上模拟面向对象
* 使用原则:
* 1,结构体第一个成员为cclass静态变量即声明为类
* 2,父类对象可为子类静态变量,也可为指针变量
* 3,类不能作为本类静态变量,可作为本类指针变量
* 4,子类只能重写父类虚函数,不能重写父类的父类的虚函数 
* 5,建议所有类对象通过_ctor/_dtor或_new/_del作为构造/析构函数后缀
* 6,建议普通结构体通过_init/_clean或_alloc/_free作为初始化/销毁函数后缀
* */
#define _STR(s) #s // 可避免CCLASS_NAME传入s为宏不会被再次展开的情况
#define CCLASS_NAME(s) _STR(s)
#define CCLASS_SIZE(s) sizeof(s)
#define CCLASS_INFO(s) CCLASS_NAME(s), CCLASS_SIZE(s)
#define CVIRTUAL // 基类虚函数标记,提醒用无实际意义
#define CCLASS_INFO_NONE {NULL, 0}
#define COBJECT_NONE NULL
typedef void* cobject;
typedef void* cmethod;
// 运行时对象的类信息,参照c++的type_info
typedef struct {
char *name;
int size;
} cclass_info;
typedef struct {
unsigned char flag[4]; // 类对象标记,是否为对象的基本条件
cclass_info info; // 类信息
cobject *inherit; // 父类对象列表
int inherit_nr; // 父类对象数量
} cclass;
// 对象创建
cobject cobject_new(char* cclass_name, int cclass_size);
// 对象销毁
void cobject_del(cobject obj);
// 对象构造
void cobject_ctor(cobject obj, char* cclass_name, int cclass_size);
// 对象析构
void cobject_dtor(cobject obj);
// 设置对象所继承的父对象
void cobject_inherit(cobject obj, cobject parent);
// 设置对象所继承的父类方法的重写
#define cobject_override(obj, virf, override) (obj)->virf = (override)
// 取消对象所继承的父类方法的重写
#define cobject_unoverride(obj, virf) (obj)->virf = NULL
// 运行时对象的类信息,参照c++的typeid
cclass_info cobject_id(cobject obj);
// 是否当前类对象
int cobject_type(cobject obj, char* cclass_name);
// 获取当前类对象(obj为当前类对象或子类对象)
cobject cobject_self(cobject obj, char* cclass_name);
#endif
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/code_hunter/libcobject.git
git@gitee.com:code_hunter/libcobject.git
code_hunter
libcobject
libcobject
master

搜索帮助