由于某些原因,你不想公开你的源码,只提供库文件给客户使用,而且不想让客户看到定义的数据结构,怎么办呢??C语言的不透明结构体句柄就派上用场了。
下面这个列子用来说明怎么实现不透明结构体,例子总共有四个文件:
type.h sstruct.h flib.c test.c。
sstruct.h 结构体定义头文件,自己编译时使用,不给客户隐藏结构体定义。
type.h 编译好的库文件函数接口说明和句柄定义,给客户使用。
flib.c 给客户的函数库文件,这里只编译成.o文件,再加一个编译命令就编译成 XX.a静态库 或者 XX.so动态库
test.c 模拟客户的主函数文件,客户通过type.h定义的接口调用flib.c编译好的库文件。
|
//type.h typedef struct _Life_t * MsgLife; |
|
//sstruct.h #include <stdio.h> |
| //flib.c #include "sstruct.h" #include "type.h" void func( MsgLife *life ) { *life = NULL; MsgLife_t *myl=NULL; myl = (MsgLife)malloc( sizeof(MsgLife_t) ); myl->port = 5555; strncpy( myl->ip, "255.255.255.255", 16 ); printf( "in func ip=%s port=%d/n", myl->ip, myl->port ); *life = myl; return; } void freefunc( MsgLife *life ) { MsgLife_t *myl=*life; myl->port = 6666; strncpy( myl->ip, "111.111.111.111", 16 ); printf("in freefunc ip=%s port=%d/n", myl->ip, myl->port ); free( myl ); *life = NULL; printf("finished free the malloc point/n"); return; } |
将文件中间的注释去掉,编译就会报类似XX未声明的错误。
|
//test.c #include "type.h" |
下面是编译命令,这里只是简单的将flib.c编译成flib.o文件,然后test.c主函数文件在编译的时候直接添加flib.o文件,跟编译添加静态库文件原理一样,只不过静态库打了一个包。实际应用当然是编译成静态库.a文件或者是动态库.so文件了。
|
cc -c flib.c -g
运行结果如下: [mgqw@localhost 123]$ ./test |
在C语言中,为了保护数据结构的细节并实现源码的隐藏,可以使用不透明结构体句柄。通过在库文件中定义结构体并在接口头文件中仅声明句柄,使得客户只能通过库函数操作结构体,而无法直接访问其内部。文章通过一个包含四个文件(type.h、sstruct.h、flib.c、test.c)的示例,演示了如何实现这一机制,并提供了简单的编译命令。
1299

被折叠的 条评论
为什么被折叠?



