c语⾔句柄结构体,C语⾔不透明结构体句柄--数据隐藏
eden猴⼦mgqw个⼈编程经验:
注:本⽂针对的是linux下C/C++编程,windows下原理应该⼀样,只是编译命令不同。
由于某些原因,你不想公开你的源码,只提供库⽂件给客户使⽤,⽽且不想让客户看到定义的数据结构,怎么办呢??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编译好的库⽂件。
其中sstruct.h是定义结构体的头⽂件,只被库⽂件flib.c引⽤;⽽type.h则定义了库⽂件flib.c实现的函数和库⽂件的结构体句柄,库⽂件flib.c和test.c主函数⽂件都引⽤。四个⽂件代码如下:
//type.h
typedef struct _Life_t * MsgLife;
void func( MsgLife *life );
void freefunc( MsgLife *life );
//sstruct.h
#include
#include
typedef struct _Life_t
{
char ip[16];
unsigned short port;
}MsgLife_t;
//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"
c语言struct头文件int main()
{
MsgLife life;
func( &life );
// printf( "ip=%s port=%d/n", life->ip, life, port );
freefunc( &life );
return 1;
}
下⾯是编译命令,这⾥只是简单的将flib.c编译成flib.o⽂件,然后test.c主函数⽂件在编译的时候直接添加flib.o⽂件,跟编译添加静态库⽂件原理⼀样,只不过静态库打了⼀个包。实际应⽤当然是编译成静态库.a⽂件或者是动态库.so⽂件了。
cc -c flib.c -g
cc -o test test.c flib.o -g
运⾏结果如下:
[mgqw@localhost 123]$ ./test in func ip=255.255.255.255 port=5555in freefunc ip=111.111.111.111
port=6666finished free the malloc point
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论