我刚回到C编程领域,我遇到了一个与链接器相关的问题。
我也是第一次使用cmake,这可能会增加我的挫败感。
我已经包含了第三方头文件,其中包含我的代码尝试使用的typedef,并且它包含以下行:
typedef struct pcap pcap_t;
所以我的代码有
pcap_t *var;
//later.....
var->fd;// this line throws the error
抛出
error: dereferencing pointer to incomplete type
所以我只是缺少另一个包含文件,或者这是一个链接器问题?我在QtCreator中使用cmake构建此代码。我可以在a_t上潜水,看看包含标题中的typedef声明,但我似乎无法深入研究“struct a”本身,看看它来自何处。
由于
编辑上面的代码以反映我正在使用pcap库
所以我在源文件的头文件中包含以下行
#include <net/bpf.h>
#include <pcap/pcap.h>
所以我猜这两个包括,我错过了pcap结构的定义。我在哪里可以找到它?
由于
答案 0 :(得分:4)
typedef
语句做了两件事。它声明存在struct a
类型的东西。它还声明a_t
是struct a
的别名。声明存在没有任何信息来确定其大小的类型由C语言调用不完整类型。该声明被通俗地称为一个的向前声明的,并且类型通俗地称为的不透明的到从来没有看到该类型的定义代码的那些部分。< / p>
typedef struct a a_t;
a_t *var;
C语言允许定义指向不完整类型的指针。指向不完整类型的指针本身并不完整,因为指向类型的指针与void指针的大小相同。但是,您的代码会尝试取消引用指针:
var->member;
由于没有struct a
可用的定义,编译器在程序中发现错误,并告诉您相关信息。它不是链接器问题,而是程序中的语义错误。
opaque类型是一种隐藏类型用户的实现细节的方法。也就是说,这是C提供界面的方式:
typedef struct a a_t;
a_t *a_create ();
void a_destroy (a_t *);
int a_get_member (a_t *);
void a_set_member(a_t *, int);
然后,在您的代码中,您应该使用该接口。
a_t *var = a_create();
a_set_member(var, 10);
int m = a_get_member(var);
a_destroy(var);
实现接口的源文件实际上将定义struct a
的外观。既然您说调试器中没有要引用的定义,这可能意味着您没有在程序中的任何位置提供定义。
编辑:您似乎正在尝试使用数据包捕获库。您需要在代码中加入<pcap.h>
标头文件,并与-lpcap
相关联。如果头文件或库不存在,则需要为您的操作系统安装数据包捕获开发包。 <pcap.h>
已经为pcap_t
创建了一个typedef,它是故意不透明的。因此,您必须使用头文件定义的接口来访问所需的信息。