如果您依赖实现定义的行为,那么可以,但是您必须以不同的方式组织它:
#ifdef UNNAMED_BITFIELDS_ARE_WELL_DEFINED
#define ANON
#else
#define ANON3(X) anonymous__## X ##__
#define ANON2(X) ANON3(X)
#define ANON ANON2(__LINE__)
#endif
struct union_struct {
char foo;
union {
struct {
char bar : 2;
char ANON : 6;
};
struct {
char ANON : 2;
char foobar1 : 6;
};
struct {
char ANON : 2;
char foobar2 : 6;
};
};
};
第一个字节是foo
,第二个字节是匿名联合。然后匿名联合有 3 个单字节匿名结构。每个结构(可选)使用未命名的位域来允许foobar1
和foobar2
表示后面的相同 6 位bar
。
根据我对 C.11 标准的理解,上面的代码在UNNAMED_BITFIELDS_ARE_WELL_DEFINED
定义时是正确的。然而,关于未命名的位域是否具有明确定义的语义似乎存在争议(见下面的评论)。如果未命名的位域没有明确定义的语义,那么上面的代码可以将每个ANON
宏扩展为位域的名称。
但是,C.11 标准仅在、 和上定义位域_Bool
,而对位域使用任何其他类型是实现定义的(C.11 §6.7.2.1 ¶5)。int
unsigned