当前位置:  开发笔记 > 编程语言 > 正文

C中的空结构

如何解决《C中的空结构》经验,为你挑选了4个好方法。

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

warning: struct has no members

是否可以添加成员并保持sizeof结构为零?还有其他方法吗?



1> ShuggyCoUk..:

在c中,空结构的行为是编译器相关的而不是c ++,它是规范的一部分(这里的解释)

C++
具有空的成员序列和基类对象的类是一个空类.空类类型的完整对象和成员子对象应具有非零大小.

在C语言中它更加模糊,因为c99标准有一些语言意味着不允许真正的空结构(参见TrayMan的答案),但许多编译器确实允许它(例如gcc).

由于这是依赖于编译器的,因此在这种情况下您不太可能获得真正可移植的代码.因此,抑制警告的非便携方式可能是您最好的选择.

在VS中,您将使用#pragma warning

在4.2.1的GCC中你有诊断编译


@unwesen(我指出了它们之间的区别(许多人可能认为这是相同的地方),pragma内容与OP的问题有关。我的回答基本上是“这取决于编译器对不起”,一些特定的编译器建议和有关*为什么*的信息

2> ebassi..:

如果您只需要用于转换和函数参数的结构符号,那么只需:

typedef struct _Interface Interface;

这将为不透明类型创建符号.


谢谢!我试图在不同的编译器上测试我的项目,并在Borland C++中得到一个奇怪的编译错误.它告诉我这个使用空结构的函数不是它所声明的类的成员.我一直试图在最后2.5小时内解决这个问题.事实证明,我所要做的就是在声明空结构时摆脱括号,就像你展示的那样,并且它工作正常.一个人的儿子----.谢谢!!

3> Mike..:

从技术上讲,这甚至不是有效的C.

TrayMan在他的分析中有点偏,是的,6.2.6.1说:

除了位字段之外,对象由一个或多个字节的连续序列组成,其数量,顺序和编码要么是显式指定的,要么是实现定义的.

但与6.2.5-20相关,其中说:

- 结构类型描述顺序分配的非空成员对象集(并且在某些情况下,是不完整的数组),每个成员对象具有可选的指定名称和可能不同的类型.

现在你可以得出结论,结构将是一个或多个字节,因为它们不能为空.您的代码会给您一个警告,而相同的代码实际上无法在Microsoft的Visual Studio上编译并出现错误:

错误C2016:C要求结构或联合至少有一个成员

所以简短的回答是否定的,没有一种可移植的方法来避免这种警告,因为它告诉你你违反了C标准.您必须使用特定于编译器的扩展来抑制它.



4> TrayMan..:

C99标准在这方面有些含糊不清,但似乎说空结构应该具有非零大小.

6.2.6.1除了位字段外,对象由一个或多个字节的连续序列组成,其数量,顺序和编码要么是显式指定的,要么是实现定义的.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有