C中空结构的大小是多少?
据我说,它是零,但这里似乎有点混乱
我用gcc编译器对它进行了测试,它给出了零作为输出。 我知道在C ++中,空类的大小是1.如果我在这里遗漏任何东西,请告诉我。
结构在C中不能为空,因为语法禁止它。 此外,如果结构没有命名成员,则存在一个语义约束,使行为不确定:
struct-or-union-specifier: struct-or-union identifieropt { struct-declaration-list } struct-or-union identifier struct-or-union: struct union struct-declaration-list: struct-declaration struct-declaration-list struct-declaration struct-declaration: specifier-qualifier-list struct-declarator-list ; /* type-specifier or qualifier required here! */ specifier-qualifier-list: type-specifier specifier-qualifier-listopt type-qualifier specifier-qualifier-listopt struct-declarator-list: struct-declarator struct-declarator-list , struct-declarator struct-declarator: declarator declaratoropt : constant-expression
如果你写
struct identifier { };
它将为您提供诊断消息,因为您违反了语法规则。 如果你写
struct identifier { int : 0; };
然后你有一个没有命名成员的非空结构,因此行为未定义,不需要诊断:
如果struct-declaration-list不包含命名成员,则行为未定义。
请注意,不允许以下内容,因为灵活的数组成员不能是第一个成员:
struct identifier { type ident[]; };
C语法不允许struct
的内容为空 – 必须至少有一个未命名的位域或命名成员(就语法而言 – 我不确定是否只包含一个结构的结构未命名的位域是有效的)。
支持C中的空结构是GCC的扩展 。
在C ++中,空结构/类成员规范是明确允许的,但是大小定义为1 – 除非作为空基本优化的一部分,允许编译器使空基类在派生类中不占用空间。
在C99中:“如果struct-declaration-list不包含命名成员,则行为未定义。”
尽管我没有看到任何需要诊断的东西,但语法并没有真正允许它,这使得它几乎回到了“未定义的行为”阵营。
在VC 8上,如果我们尝试获取sizeof空结构,则会出错,反之在linux上使用gcc,它给出大小为1,因为它使用gcc扩展而不是c语言规范,这表示这是未定义的行为。
struct node { // empty struct. }; int main() { printf("%d", sizeof(struct node)); return 0; }
在Windows vc 2005上它使用gcc在linux上提供了编译错误,它给出了大小为1,因为gcc扩展名为http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Empty-Structures.html#Empty-Structures(As Michael Burr指出)