[英]alternative to defining struct in header file for 'error dereferencing pointer to incomplete type' in c
我知道关于此还有其他问题,它们通常指向在头文件中声明和定义struct
和typedef struct
的标准解决方案。 但是,我正在查看标头中包含某人的其他代码:
struct A;
typedef struct A A_t;
然后在* .c文件中定义结构A以及其他功能的实现。 A
的实现包括很多定义,等等也都包含在* .c中,而不包含在头文件中。
然后在main.c
中包含标头,并且我声明和定义了新函数,它们使用了指向A_t
的(空)指针,当尝试访问该结构的成员时,该error dereferencing pointer to incomplete type
会error dereferencing pointer to incomplete type
。
在这种情况下,是否还有其他方法可以在标头中声明和定义struct和typedef?
编辑:只是为了澄清原始代码预见到用户创建了一些函数,然后将这些函数传递给主例程。 例如,用户应该创建一个函数来连接到套接字,关闭套接字连接,发送和接收数据。 因为我需要套接字的标识符/文件描述符,所以我在A
的定义中添加了一个int
,这是我不能取消引用的。 我希望这可以澄清上下文。
如果有人用这种方式编写了代码,并且您认为某人是一个足够体面的程序员,那么他可能是故意这样做的。
在适当的C API设计中,您可能需要公开一个指向内部数据结构的指针,以便能够在函数调用中存储上下文,并期望您的库用户从您那里收到该指针,进行存储并将其返回下次调用您的资料库。
在这种情况下,最简单的答案是:不会让您弄乱该指针,也不会希望自己分配这些结构之一,也不会取消对它的指针的引用。 X11是一个著名的例子。
如果实际上需要能够取消引用此类指针或访问结构成员,则需要访问某些头文件中的完整结构定义。 您选择要放置定义的位置,可以有多个(即没有“ the”头文件之类的东西)头。
编辑之后,我建议您这样做:
显然,您的库的创建者已经非常注意不要在其模块之外公开该结构-我会这样。
您需要向结构中添加一个int
并已这样做,因此您显然可以访问.c源。 这样做,将其放入C文件,并在其中保留结构定义。 添加一个setInt(struct A*, int)
和一个getInt(struct A*)
函数,该函数允许您从这样的不透明指针(getter和setter函数)中设置和检索int
。 在C文件的标题中公开这两个函数。 这保留了信息隐藏的初衷,但仍然允许您扩展结构。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.