取消引用指向不完整类型的指针
我从这段代码中得到以下错误,我是C的新手并且随着我的学习而学习!
cc -g -I /usr/lib/i386-linux-gnu -c anld.c anld.c: In function 'main': anld.c:379:11: error: dereferencing pointer to incomplete type
主.C文件
bridge_t *bridge_p = bridge_new(); //Create / init our bridge bridge_p->s = server_connect(options.server_p, options.dest_port, options.ifname_p, options.gateway_p);
bridge .C文件
struct bridge { int s; }; bridge_t *bridge_new(void) { bridge_t *bridge_p; bridge_p = OPENSSL_malloc(sizeof *bridge_p); if (!bridge_p) { return NULL; } /* Initialise bridge */ memset(bridge_p, '\0', sizeof *bridge_p); bridge_p->s = -1; return bridge_p; }
bridge.h文件
typedef struct bridge bridge_t;
有人有什么想法?
为了避免你提到的错误,你应该移动它:
struct bridge { int s; };
to bridge.h
。
目前它被声明为模块(翻译单元) bridge.c
本地,因此其成员对外界不了解。
或者,如果要隐藏struct bridge
的内部,则需要为模块bridge.c
添加一个getter和setter函数,以便为每个要从外部访问的成员添加,例如:
bridge.h
typedef struct bridge bridge_t; void brigde_s_set(bridge_t *, int); int bridge_s_get(bridge_t *);
bridge.c
#include "bridge.h" struct bridge { int s; }; int brigde_s_set(bridge_t * pb, int s) { pb->s = s; } int bridge_s_get(bridge_t * pb) { return pb->s; }
所以main.c
的片段看起来像:
#include "bridge.h" ... bridge_t * bridge_p = bridge_new(); //Create / init our bridge bridge_s_set(bridge_p, server_connect(options.server_p, options.dest_port, options.ifname_p, options.gateway_p));