C语言能否通过结构体实现面向对象编程

熟悉 Go 的话,完全能用 Go 的一套思维写 C。虽说这样没有 Go 的类型检查能力,且不支持多态。但我们也没必要强制要求语法层级面向对象,不然,C 就不是 C 了,还不如直接用 C++/Go/Java。
有时候,我会觉得 Go 的面向对象写法就是从 C 学来的,只是在上面做了一些改进。
typedef struct { int age} Person;void setAge(Person* p, int age) { p-\u0026gt;age = age;}Go 的实现
type Person struct { age int}func (p *Person) setAge(age int) { p.age = age}像不像?
基本只有类型位置不同,一个前,一个后。还有就是把 C 函数的第一个参数移到了函数开始位置。

■网友
谢邀,c如果要达到完全面向对象的封装、继承、多态是及其痛苦的,但是如果你要封装一个vtable这种是可以做到的,类似:
struct my_vtclass{ void (*func1)( struct my_vtclass *, ... ); void (*func2)( struct my_vtclass *, ... ); ...}struct my_class1{ struct my_vtclass * vtbl; ...}struct my_class2{ struct my_vtclass * vtbl; ...}但是用起来很痛苦,之前好像有人用纯c完全封装了微软的COM对象。
另外有个家伙专门写了用ANSI-C实现oo的论文:https://www.cs.rit.edu/~ats/books/ooc.pdf

■网友
C语言有个关键字typedef,就是用来声明新的数据类型的。。。常见的做法是给结构体定个新类型,然后用新类型定义变量。。。但是这个新类型是不能绑定函数或方法的,因此也就不能实现封装、继承或多态等特征。。。也因为这样,人们发明了C++。由于C++标准是全面兼容C语言的,因此也就必要再对C语言进行改造,搞出一个新的面向对象C了。。。不过,就算这样还是有人不满意,所以有了C#和Object-C。。。
■网友
参考 GObject

■网友
能!而且在有些嵌入式系统里就是这么做的,因为性能和资源。实际上面向对象语言最终也是通过过程式语言来实现的。用C语言实现面向对象,首先要手动的构建一些基础设施,比如你要有一个基类,用宏、结构和函数指针来封装基本的面向对象功能。继承一个类要遵循你自己定义的编程规范,基本上就是继承父类的结构,增加属于自己域和方法。......很多以前编译器或者解释器替你做的事情现在需要你自己去做了。
■网友
除了封装没有语法支持只能靠口头协议以外,别的你就照表面意思实现就行了。
【C语言能否通过结构体实现面向对象编程】 Go没接触过,不过按你的描述恐怕Go的结构体就是类。C的结构体本身只能放数据,其他面向对象逻辑你只能自己写。

■网友
在这里typedef和函数指针是非常重要的。
1.typedef unsigned char u8;
2.typedef strcut _cmd {
char *name;
int id;
}cmd_t;
cmd_t *pcmd; //定义结构指针变量
约定:别名:XXX_t
3.typedef void (*c_t)(void); //函数指针
c_t cb = led_init;
cb();
4.用结构体来描述事物(如命令) 命令的属性:命令名和对应的函数
typedef void (*c_t)(void);
typedef struct _cmd {
char *name;
c_t call_back; //命令对应的函数
}cmd_t;
这里仅仅只实现面向对象里面的封装。继承和多态没有实现。
如果想深入学习面向对象编程,可以看狄泰软件学院唐佐林的C++深度解析课程。里面有几课详细讲解到了用C语言实现面向对象

■网友
面向对象的c?
Redhat不是搞了一个vala么?还有gtk以及很多gnome相关的东西,就是用面向对象的方式使用c的,各种别扭。


推荐阅读