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

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

struct foo {
  int : 12;
};

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

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

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

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

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

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

但是一些编译器(至少GCC和clang)无论如何都允许这样做,作为扩展。

如果这是结构中唯一的位字段,则使用有点有限,但不能用作ouah说明。

标准继续与另一个“怪异”:

作为一种特殊情况,宽度为0的位域结构成员表示没有其他位域将被放入先前位域(如果有的话)被放置的单元中。


这个程序调用未定义的行为。

C说:

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

现在一些编译器接受它作为扩展。 这怎么可能有用?

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

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

看看这个宏是什么,你可以看看这里。


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

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

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

链接地址: http://www.djcxy.com/p/73557.html

上一篇: Where is struct with no named members useful?

下一篇: time struct size check, error out if odd