c - 此函数声明的预期符号问题

标签 c qt cmake

我刚刚回到 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 来查看包含的 header 中的 typedef 声明,但我似乎无法深入“struct a”本身来查看它来自哪里。

谢谢

编辑上面的代码以反射(reflect)我正在使用 pcap 库

所以我在源文件的头文件中包含了以下几行

#include <net/bpf.h>
#include <pcap/pcap.h>

所以我想在这两个包含之间,我缺少 pcap 结构的定义。在哪里可以找到它?

谢谢

最佳答案

typedef声明做了两件事。它声明了 struct a 类型的存在。 。它还声明 a_tstruct a 的别名。在声明类型存在时没有任何信息来确定其大小,C 语言将其称为不完整类型。声明通俗地称为前向声明,而类型通俗地称为不透明,对于那些永远无法看到类型定义的代码部分。

typedef struct a a_t;
a_t *var;

C 语言允许定义指向不完整类型的指针。指向不完整类型的指针本身并不是不完整的,因为指向类型的指针与 void 指针的大小相同。但是,您的代码随后尝试取消引用指针:

var->member;

由于struct a没有定义可用,编译器已捕获您的程序中的错误,并正在告诉您该错误。这不是链接器问题,而是程序中的语义错误。

不透明类型是一种向类型用户隐藏实现细节的方法。也就是说,它是C提供接口(interface)的方式:

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);

然后,在您的代码中,您应该使用该接口(interface)。

a_t *var = a_create();
a_set_member(var, 10);
int m = a_get_member(var);
a_destroy(var);

实现该接口(interface)的源文件实际上定义了什么 struct a好像。既然您说您没有在调试器中引用的定义,这可能意味着您没有在程序中的任何位置提供定义。

编辑:您似乎正在尝试使用数据包捕获库。您需要包含<pcap.h>头文件到您的代码,并链接到 -lpcap 。如果头文件或库不存在,您将需要安装适合您操作系统的数据包捕获开发包。 <pcap.h>已为 pcap_t 创建了 typedef已经,并且它是故意不透明的。因此,您必须使用头文件定义的接口(interface)来访问您想要的信息。

关于c - 此函数声明的预期符号问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11376086/

相关文章:

c++ - 如何使用关键字签名在 CMake 上链接 opengl 库

c - 如何正确重启服务器套接字?

使用 libxml2 的 C 代码在 Win 7 上的 cygwin 上给出编译时错误

qt - 可调整大小的 PyQt 小部件显示具有固定纵横比的图像

c++ - 我怎样才能让 CMake 用两种不同的语言编译同一个输入文件?

c++ - 使用 arm-none-eabi-gcc、newlib 和 cmake 链接 C/C++ STM32 项目

c - 为什么 char * 不能收到正确的值?

c - 在c中的多线程中包含嵌套头文件的正确方法是什么

c++ - Qt中使用SQL对表格元素进行非常规排序

c++ - QT绘制平铺图像的方法