C中的空结构

我有一个没有成员的结构(目前),我想知道是否有可能抑制我得到的警告:

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除了位字段外,对象由一个或多个字节的连续序列组成,其数量,顺序和编码要么是显式指定的,要么是实现定义的。

是否可以添加成员并保持结构的大小为零?

不。 FWIW,C ++允许空结构,但对于空结构,sizeof()总是非零。

还有其他方法吗?

没有任何简单的。 值得注意的是,空结构仅在C中得到某种支持,在C99中是不允许的。

C ++支持空结构,但是不同的编译器使用不同的结果(对于sizeof和struct偏移)实现它们,特别是一旦你开始将inheritance抛入混合中。

如果你不要求“太严格”的坚持,你可能会逃避这个:

 struct empty { char nothing[0]; }; 

不过,这是GCC扩展 。

我有点希望能够使用名为“灵活数组”的C99function,声明如下:

 struct empty99 { char nothing[]; // This is a C99 "flexible array". }; 

但这不起作用; 它们要求首先至少有一个普通的struct成员,它们不能是唯一的成员。

 struct zero_information { int:0; }; 

上面的代码片段将从sizeof(struct zero_information)产生非零值,但它可能会帮助您获得所需的所有存储空间的100%,即填充(仅可通过黑客访问)如果加入填充是未定义的行为,我不记得从头顶。