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

The*_*ask 8 c struct

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

struct foo {
  int : 12;
};
Run Code Online (Sandbox Code Playgroud)

oua*_*uah 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); }))
Run Code Online (Sandbox Code Playgroud)

要查看此宏的内容,您可以在这里查看.


Mat*_*Mat 5

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

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

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

126未命名的位字段结构成员可用于填充以符合外部强加的布局.

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

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

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

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

标准继续另一个"古怪":

作为特殊情况,宽度为0的位域结构成员表示不再将其他位域打包到放置了前一位域(如果有的话)的单元中.