面向对象的C语言框架尝鲜

来源:互联网 发布:山灵m2知乎 编辑:程序博客网 时间:2024/06/05 13:49

从学习编程开始就一直被灌输面向对象,继承,多态等等思想,工作后遇到一些纯C的编程工作还是有些不习惯,毕竟用C实现库以及中间件给别人使用也还是不如C++方便直观。

这几天偶然看到一个轻量级的面向对象的C编程框架LW_OOPC,作者通过宏定义封装了面向对象编程的一些工具,我们可以用来方便的指定类,继承,借口等。

首先下载框架包含到我们的项目中来(lw_oopc.h以及lw_oopc.c两个文件),我下面首先定义一个抽象类People,和一个Friend类,以及一个接口放在friend.h头文件中

#ifndef __FRIEND_H#define __FRIEND_H/* *  friend.h */#include "lw_oopc.h"INTERFACE(ICall){void (*call)(ICall *ic);};ABS_CLASS(People){char name[100];int  age;void (*say)(People* p,const char *word);void (*init)(People* p,const char* name,int age);};CLASS(Friend){EXTENDS(People);IMPLEMENTS(ICall);int tel;void (*init)(Friend* f,const char* name,int age,int tel);};#endif

类的声明很简单,主要是用框架中定义的几个宏替代C++中类的声明语法,接下来是类的成员函数的定义放在friend.c源文件中

/* *  friend.c */#include "friend.h"void People_Say(People* p,const char* word){printf("%s¥n",word);}void People_Init(People* p,const char* name,int age){strcpy(p->name,name);p->age = age;}ABS_CTOR(People)FUNCTION_SETTING(say,People_Say);FUNCTION_SETTING(init,People_Init);END_ABS_CTORvoid Friend_Init(Friend* f,const char *name,int age,int tel){People *p = SUPER_PTR(f,People);People_Init(p,name,age);f->tel = tel;}void Friend_Call(Friend* f){printf("Hello Friend");}CTOR(Friend)SUPER_CTOR(People);FUNCTION_SETTING(init,Friend_Init);FUNCTION_SETTING(ICall.call,Friend_Call);END_CTOR

最后是我们的测试main.c

#include <stdio.h>#include "lw_oopc.h"#include "friend.h"int main (int argc, const char * argv[]) {    // insert code here...    Friend* f = Friend_new();f->init(f,"penjin",25,1590000000);People* p = SUPER_PTR(f,People);printf("Friend'name is %s and age is %d and tel number is %d¥n",p->name,p->age,f->tel);ICall* ic = SUPER_PTR(f,ICall);ic->call(f);lw_oopc_delete(f);lw_oopc_report();    return 0;}
输出结果Friend'name is penjin and age is 25 and tel number is 1590000000 ¥n Hello Friend

使用起来还算比较方便简单的,将来如果遇到想实现C的面向对象编程,这个框架是个不错的选择,呵呵

原创粉丝点击