我有一个没有成员的结构(目前),我想知道是否有可能抑制我得到的警告:
warning: struct has no members
是否可以添加成员并保持sizeof
结构为零?还有其他方法吗?
在c中,空结构的行为是编译器相关的而不是c ++,它是规范的一部分(这里的解释)
C++
具有空的成员序列和基类对象的类是一个空类.空类类型的完整对象和成员子对象应具有非零大小.
在C语言中它更加模糊,因为c99标准有一些语言意味着不允许真正的空结构(参见TrayMan的答案),但许多编译器确实允许它(例如gcc).
由于这是依赖于编译器的,因此在这种情况下您不太可能获得真正可移植的代码.因此,抑制警告的非便携方式可能是您最好的选择.
在VS中,您将使用#pragma warning
在4.2.1的GCC中你有诊断编译
如果您只需要用于转换和函数参数的结构符号,那么只需:
typedef struct _Interface Interface;
这将为不透明类型创建符号.
从技术上讲,这甚至不是有效的C.
TrayMan在他的分析中有点偏,是的,6.2.6.1说:
除了位字段之外,对象由一个或多个字节的连续序列组成,其数量,顺序和编码要么是显式指定的,要么是实现定义的.
但与6.2.5-20相关,其中说:
- 结构类型描述顺序分配的非空成员对象集(并且在某些情况下,是不完整的数组),每个成员对象具有可选的指定名称和可能不同的类型.
现在你可以得出结论,结构将是一个或多个字节,因为它们不能为空.您的代码会给您一个警告,而相同的代码实际上无法在Microsoft的Visual Studio上编译并出现错误:
错误C2016:C要求结构或联合至少有一个成员
所以简短的回答是否定的,没有一种可移植的方法来避免这种警告,因为它告诉你你违反了C标准.您必须使用特定于编译器的扩展来抑制它.
C99标准在这方面有些含糊不清,但似乎说空结构应该具有非零大小.
6.2.6.1除了位字段外,对象由一个或多个字节的连续序列组成,其数量,顺序和编码要么是显式指定的,要么是实现定义的.