没有命名成员的struct在哪里有用?

时间:2013-10-04 21:33:10

标签: c struct

C标准为何以及在何处允许此代码编译?它在哪里有用?

struct foo {
  int : 12;
};

3 个答案:

答案 0 :(得分:6)

该程序调用未定义的行为。

C说:

  

(C99,6.7.2.1p7)“[...]如果struct-declaration-list不包含命名成员,则行为未定义。”

现在有些编译器接受它作为扩展。这有什么用?

例如对于Linux内核着名的BUILD_BUG_ON_ZERO宏:

#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))

要查看此宏的内容,您可以查看here

答案 1 :(得分:5)

这将在§6.7.2.1结构和联合说明符

  

12)没有声明符但只有冒号和宽度的位字段声明表示   未命名的位字段。 126

脚注解释了为什么存在这样的事情:

  

126 未命名的位字段结构成员对于填充符合外部强加的布局非常有用。

话虽如此,标准的同一部分(第8段)也指出:

  

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

但是一些编译器(GCC和clang至少)允许这样作为扩展。

如果这是结构中唯一的位域,则使用有点受限,但不能像ouah所示那样使用。

标准继续以另一个“古怪”:

  

作为一种特殊情况,宽度为0的位域结构成员表示不会将更多的位域打包到放置了前一个位域(如果有的话)的单元中。

答案 2 :(得分:3)

那么,根据语言规范,如果您的程序包含没有命名成员的结构类型,则行为是未定义的。 (关于为什么它没有被正式承认为违反约束的问题,我没有立即回答。)见6.7.2.1/7

  

struct-declaration-list是一系列声明   结构或联盟的成员。如果是struct-declaration-list   不包含任何命名成员,行为未定义。

除此之外,这种声明并非真正“有用”,因为它产生的唯一内容是未定义的行为。