据我说,它是零,但似乎有点混乱here
我用gcc编译器对它进行了测试,输出为零。我知道在C ++中,空类的大小是1.如果我在这里遗漏任何东西,请告诉我。
答案 0 :(得分:41)
结构在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[]; };
答案 1 :(得分:6)
C语法不允许struct
的内容为空 - 必须至少有一个未命名的位域或命名成员(就语法而言 - 我不确定如果只包含未命名位域的结构是有效的。)
Support for empty structs in C are an extension in GCC
在C ++中,显式允许空结构/类成员规范,但是大小定义为1 - 除非作为空基本优化的一部分,允许编译器使空基类在派生中不占用空间类。
答案 2 :(得分:5)
在C99中:“如果struct-declaration-list不包含命名成员,则行为未定义。”
无论如何,语法并不真正允许它,尽管我没有看到任何需要诊断的东西,这使得它几乎回到了“未定义的行为”阵营。
答案 3 :(得分:1)
在VC 8上如果我们尝试获取sizeof空结构,则会出错。反之,在linux上使用gcc,它给出了大小为1,因为它使用gcc扩展而不是c语言规范,这表示这是未定义的行为。< / p>
struct node
{
// empty struct.
};
int main()
{
printf("%d", sizeof(struct node));
return 0;
}
Windows vc 2005上的它给出了编译错误 在linux上用gcc它给出了1的大小,因为gcc扩展 http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Empty-Structures.html#Empty-Structures (正如Michael Burr所指出的那样)