Shu*_*oUk 23
在c中,空结构的行为是编译器相关的而不是c ++,它是规范的一部分(这里的解释)
C++
具有空的成员序列和基类对象的类是一个空类.空类类型的完整对象和成员子对象应具有非零大小.
在C语言中它更加模糊,因为c99标准有一些语言意味着不允许真正的空结构(参见TrayMan的答案),但许多编译器确实允许它(例如gcc).
由于这是依赖于编译器的,因此在这种情况下您不太可能获得真正可移植的代码.因此,抑制警告的非便携方式可能是您最好的选择.
eba*_*ssi 20
如果您只需要用于转换和函数参数的结构符号,那么只需:
typedef struct _Interface Interface;
这将为不透明类型创建符号.
Mik*_*ike 12
从技术上讲,这甚至不是有效的C.
TrayMan在他的分析中有点偏,是的,6.2.6.1说:
除了位字段之外,对象由一个或多个字节的连续序列组成,其数量,顺序和编码要么是显式指定的,要么是实现定义的.
但与6.2.5-20相关,其中说:
- 结构类型描述顺序分配的非空成员对象集(并且在某些情况下,是不完整的数组),每个成员对象具有可选的指定名称和可能不同的类型.
现在你可以得出结论,结构将是一个或多个字节,因为它们不能为空.您的代码会给您一个警告,而相同的代码实际上无法在Microsoft的Visual Studio上编译并出现错误:
错误C2016:C要求结构或联合至少有一个成员
所以简短的回答是否定的,没有一种可移植的方法来避免这种警告,因为它告诉你你违反了C标准.您必须使用特定于编译器的扩展来抑制它.
struct zero_information { int:0; };
上面的代码片段将从 中产生一个非零值sizeof(struct zero_information),但它可能会帮助你得到你想要的东西,因为分配给它的所有存储的 100% 是填充(只能通过 hacks 访问,尽管我不记得了)如果接受填充是未定义的行为,从我的头顶来看)。