零大小的结构

时间:2012-06-10 19:23:28

标签: c++ c gcc

我注意到在使用GCC编译时4.6 sizeof(Foo)为0且sizeof(Bar)为1.由于某种原因,将空数组添加到空结构中使其大小为0.我认为两者的大小都是结构必须相同。这是怎么回事?

struct Foo
{
    char x[];
};

struct Bar {};

3 个答案:

答案 0 :(得分:16)

C标准不允许struct声明。 n1570中的6.7.2.1(8):

  

如果struct-declaration-list不直接或通过匿名结构或匿名联合包含任何命名成员,则行为未定义。

同一部分的第18段:

  

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这被称为灵活的数组成员。在大多数情况下,忽略灵活的数组成员。特别是,结构的大小就好像省略了灵活的阵列成员,除了它可能有比尾随填充更多的尾随填充。

(强调我的)

C ++中不允许使用灵活的数组成员,因此代码也不是有效的C ++。

由于它不是有效代码,sizeof为这些代码报告的值毫无意义。

答案 1 :(得分:1)

即使对于空类,sizeof运算符也不会产生0。

正如您所见here on msdn

此外,msdn说明:

sizeof运算符不能与以下操作数一起使用:

  • 函数。 (但是,sizeof可以应用于指向函数的指针。)
  • 位字段。
  • 未定义的课程。
  • 类型无效。
  • 动态分配数组。
  • 外部阵列。
  • 类型不完整。
  • 不完整类型的带括号的名称。

答案 2 :(得分:1)

C和C ++不允许零大小的对象。

gcc确实支持作为扩展。如果使用适当的选项进行编译,例如

gcc -std=c99 -pedantic -Wall -Wextra

gcc至少会警告你他们; g ++有类似的选择。