C中空结构的大小是多少?

vin*_*rak 24 c compiler-construction

据对我来说,它是零,但似乎有一点混乱这里

我用gcc编译器对它进行了测试,它给出了零作为输出.我知道在C++中,空类的大小是1.如果我在这里遗漏任何东西,请告诉我.

Joh*_*itb 41

结构在C中不能为空,因为语法禁止它.此外,如果struct没有命名成员,则存在一个语义约束,使行为不确定:

struct-or-union-speci?er:
  struct-or-union identi?eropt { struct-declaration-list }
  struct-or-union identi?er

struct-or-union:
  struct
  union

struct-declaration-list:
  struct-declaration
  struct-declaration-list struct-declaration

struct-declaration:
  speci?er-quali?er-list struct-declarator-list ;

/* type-specifier or qualifier required here! */
speci?er-quali?er-list:
  type-speci?er speci?er-quali?er-listopt
  type-quali?er speci?er-quali?er-listopt

struct-declarator-list:
  struct-declarator
  struct-declarator-list , struct-declarator

struct-declarator:
  declarator
  declaratoropt : constant-expression
Run Code Online (Sandbox Code Playgroud)

如果你写

struct identifier { };
Run Code Online (Sandbox Code Playgroud)

它将为您提供诊断消息,因为您违反了语法规则.如果你写

struct identifier { int : 0; };
Run Code Online (Sandbox Code Playgroud)

然后你有一个没有命名成员的非空结构,因此行为未定义,不需要诊断:

如果struct-declaration-list不包含命名成员,则行为未定义.

请注意,不允许以下内容,因为灵活的数组成员不能是第一个成员:

struct identifier { type ident[]; };
Run Code Online (Sandbox Code Playgroud)

  • 空结构是GCC扩展. (12认同)
  • 用`-ansi -pedantic`编译给出"main.c:2:警告:struct没有成员" (9认同)
  • C99至少说"如果预处理翻译单元或翻译单元包含违反任何语法规则或约束的情况,则符合要求的实现应产生至少一条诊断消息(以实现定义的方式标识),......" (4认同)

Mic*_*urr 6

C语法不允许a的内容为struct空 - 必须至少有一个未命名的位域或命名成员(就语法而言 - 我不确定是否只包含一个未命名的结构bitfield否则有效).

在C中支持空结构是GCC的扩展.

在C++和空结构/类中,成员规范是明确允许的,但是大小被定义为1 - 除非作为空基本优化的一部分,允许编译器使空基类在派生类中不占用空间.


Jer*_*fin 5

在C99中:"如果struct-declaration-list不包含命名成员,则行为未定义."

尽管我没有看到任何需要诊断的东西,但是语法并没有真正允许它,这使得它几乎回到了"未定义的行为"阵营.