零大小的结构

我注意到当使用GCC编译时, sizeof(Foo)为0且sizeof(Bar)为1.由于某种原因,将空数组添加到空结构中使其大小为0.我认为两个结构的大小必须相同。 这里发生了什么?

 struct Foo { char x[]; }; struct Bar {}; 

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

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

和同一部分的第18段:

作为一种特殊情况, 具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型; 这被称为灵活的数组成员。 在大多数情况下,忽略灵活的数组成员。 特别地,结构的尺寸好像省略了柔性arrays构件,除了它可以具有比遗漏意味着更多的拖尾衬垫。

(强调我的)

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

由于它不是有效代码,因此sizeof报告的值无意义。

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

正如你在msdn上看到的那样

此外,msdn说明:

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

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

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

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

 gcc -std=c99 -pedantic -Wall -Wextra 

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