4

是否有可能在 C 中获得以下结构的大小为 2?

#include <stdio.h>

struct union_struct {
    char foo;
    char bar : 2;
    union {
        char foobar1 : 6;
        char foobar2 : 6;
    };
};

int main(void)
{
    printf("size of union struct: %d\n", sizeof(struct union_struct));
    return 0;
}

输出,用 gcc 编译:

size of union struct: 3

4

1 回答 1

5

如果您依赖实现定义的行为,那么可以,但是您必须以不同的方式组织它:

#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 个单字节匿名结构。每个结构(可选)使用未命名的位域来允许foobar1foobar2表示后面的相同 6 位bar

根据我对 C.11 标准的理解,上面的代码在UNNAMED_BITFIELDS_ARE_WELL_DEFINED定义时是正确的。然而,关于未命名的位域是否具有明确定义的语义似乎存在争议(见下面的评论)。如果未命名的位域没有明确定义的语义,那么上面的代码可以将每个ANON宏扩展为位域的名称。

但是,C.11 标准仅在、 和上定义位域_Bool,而对位域使用任何其他类型是实现定义的(C.11 §6.7.2.1 ¶5)。intunsigned

于 2013-09-05T23:23:15.517 回答