最近写了一个linux 下tcp聊天室程序,刚开始时是写在一个文件里的版本,后来整理了思路写在了不同的文件里,于是考虑程序间的调用关系,参数传递,接口之类的问题,发展到最后考虑的是数据完全的封装。
比如在test.c中定义
用了这样的方法封装数据后,对malloc 和free的调用成了必须的步骤,正好对应了c++的构造函数和析构函数,相比于c++,如果c语言每个模块都用这样的方法,那么每个模块中都得写init和dinit这样的函数,c++的构造和析构函数的确方便了不少#include "stu.h" struct Stu { int id; char name[10]; }; struct Stu* stu_init() { struct Stu* stu = (struct Stu* )malloc(sizeof(struct Stu)); return stu; } void stu_dinit (struct Stu* stu) { if (!stu) free(stu); } stu_setname (const char* name, struct Stu* stu) { strcpy (stu->name, name); } char* stu_getname (struct Stu) { return stu->name; } 在test.h中 Struct Stu; //以前我会把结构体的定义放在.c文件中,这次,只把声明放在这里, //于是其他用户无法知道该结构体的定义,而且无法直接访问该结构体的成员, //由此达到封装的目的 struct Stu* stu_init() ; void stu_dinit (struct Stu* stu) ; stu_setname (const char* name, struct Stu* stu); char* stu_getname (struct Stu); 在main.c中 #include “test.h” void main (void) { //struct Stu stu; 这条语句将出错,提示 该类型变量大小未知。 struct Stu* stu; //只能以这样方式访问该结构体。 stu = stu_init();//为结构体分配存储空间(mallod) 并返回指针, stu_setname(“张飞”, stu); printf ("%s \n", stu_getname)://对结构体的访问只能通过test.h列出的接口函数完成,从而隐藏了数据。 stu_dinit(stu);//释放内存 }