零大小结构
Zero size struct
本文关键字:结构 更新时间:2023-10-16
我注意到,当用GCC 4.6编译时,sizeof(Foo)
是0,sizeof(Bar)
是1。出于某种原因,将空数组添加到空结构中使其大小为 0。我认为两个结构的大小必须相同。这是怎么回事?
struct Foo
{
char x[];
};
struct Bar {};
C 标准不允许struct
声明。 N1570 中的 6.7.2.1 (8):
如果结构声明列表不包含任何命名成员,无论是直接还是通过匿名结构或匿名联合,则行为是未定义的。
以及同一节的第18段:
作为特例,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。在大多数情况下,将忽略灵活数组成员。特别是,结构的大小就像省略了柔性数组成员一样,只是它可能具有比省略所暗示的更多的尾随填充。
(强调我的)
C++中不允许使用灵活的数组成员,因此代码C++也无效。
由于它不是有效的代码,因此sizeof
为这些代码报告的值毫无意义。
sizeof 运算符永远不会产生 0,即使对于空类也是如此。
正如您在 MSDN 上看到的
此外,MSDN 指出:
sizeof 运算符不能与以下操作数一起使用:
- 功能。(但是,sizeof 可以应用于指向函数的指针。
- 位字段。
- 未定义的类。
- 类型空。
- 动态分配的数组。
- 外部数组。
- 不完整的类型。
- 不完整类型的括号名称。
C 和 C++ 不允许使用零大小的对象。
GCC 确实支持它们作为扩展。 如果使用正确的选项进行编译,例如
gcc -std=c99 -pedantic -Wall -Wextra
GCC 至少会警告你它们;G++ 也有类似的选择。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?