【发布时间】:2009-10-26 18:21:00
【问题描述】:
据我所知,它是零,但似乎有点混乱here
我已经用 gcc 编译器对其进行了测试,它给了我零作为输出。我知道在 C++ 中,空类的大小是 1。如果我在这里遗漏了什么,请告诉我。
【问题讨论】:
-
@Ben S 感谢您重新格式化问题!
-
C++ 标准(至少 C++03)没有声明
sizeof应用于空类/结构的结果等于 1。
据我所知,它是零,但似乎有点混乱here
我已经用 gcc 编译器对其进行了测试,它给了我零作为输出。我知道在 C++ 中,空类的大小是 1。如果我在这里遗漏了什么,请告诉我。
【问题讨论】:
sizeof 应用于空类/结构的结果等于 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[]; };
【讨论】:
-ansi -pedantic 编译给出“main.c:2: warning: struct has no members”
C 语法不允许 struct 的内容为空 - 必须至少有一个未命名的位域或命名成员(就语法而言 - 我不确定一个仅包含未命名位域的结构在其他情况下有效)。
Support for empty structs in C are an extension in GCC.
在 C++ 中,明确允许空结构/类成员规范,但大小定义为 1 - 除非作为空基优化的一部分,允许编译器使空基类在派生中不占用空间类。
【讨论】:
在 C99 中:“如果 struct-declaration-list 不包含命名成员,则行为未定义。”
语法实际上并不允许这样做,尽管我没有看到任何说需要诊断的东西,这使它几乎回到了“未定义行为”阵营。
【讨论】:
在 VC 8 上,如果我们尝试获取空结构的 sizeof,则会出错,而在使用 gcc 的 linux 上,它会给出大小 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 (正如迈克尔·伯尔所指出的)
【讨论】: