我想在头文件中的不同结构定义中声明一个结构值。所以我在头文件中完成了以下操作。但是编译器给了我错误消息field myStructMember has incomplete type
struct My_A{
int value;
};
在B.h头文件中:
struct My_A; // forward declaration
struct My_B
{
struct My_A myStructMember; // error is here!
int differentValue;
};
是否可以在结构声明中声明结构成员?
编辑: My_A和My_B在不同的头文件中声明。
编辑2:
当我在B.h中添加“A.h”时,它就可以了。它有什么问题吗?
在B.h头文件中:
include "A.h" // added this line insead of forward declaration
struct My_B
{
struct My_A myStructMember; // not any error anymore
int differentValue;
};
答案 0 :(得分:1)
错误就是它所说的 - 在你拥有完整类型之前你不能使用struct。你根本就不知道它的大小。前方声明在这里没有帮助。
或者,您可以使用指向struct的指针。指针大小是已知的。
答案 1 :(得分:1)
编译器解析A.h
时,B.h
(或B.h
每次引用时都不包括My_B
,否则它缺少确定所需的信息大小My_A
。您可以使用指针代替,但这会获得处理它们的所有开销。
如果您只是想实现抽象/细节隐藏,那么您可以更改My_A
的前向声明,以便它现在是正确大小的结构(例如,使用char数组)。然后,您必须确保没有任何内容同时包含A.h
和 B.h
,因为这会导致编译器错误。哦,确实确保你的尺寸正确或者会发生奇怪的事情。有很多方法可以使用宏断言来确保这是正确的。
e.g。制作B.h
struct My_A{
char hidden_data[4];
};
struct My_B
{
struct My_A myStructMember;
int differentValue;
};