如何在不命名的情况下访问union的成员?

时间:2017-05-17 04:31:52

标签: c unions

我有一些与以下

非常相似的代码
struct T {
    union {
        unsigned int x;
        struct {
            unsigned short xhigh;
            unsigned short xlow;
        };
    } x;
    /* ...repeated a handful of times for different variables in T... */
};

这完全符合您的期望:它允许我声明struct T类型的变量并访问t.x.xt.x.xhight.x.xlow。到目前为止一切都很好。

然而,如果我只想t.x 我希望以unsigned int数量访问union的值,我会非常喜欢它,但是保留独立访问高阶和低阶部分的能力,而无需借助位掩码和移位,也不会调用未定义的行为。

这可能在C?

如果可能,那么声明的C语法是什么?

当我尝试简单地访问t.x而不是t.x.x的naiive方法时,我会收到警告消息,例如(此特定来自printf()来电):

cc -ansi -o test -Wall test.c
test.c: In function ‘my_function’:
test.c:13:2: warning: format ‘%X’ expects argument of type ‘unsigned int’, but argument 2 has type ‘const union <anonymous>’ [-Wformat]

使用-std=c11代替-ansi会产生相同的警告。

1 个答案:

答案 0 :(得分:7)

匿名联合是一件事,如果你可以使用匿名结构(它们都是C11特性或编译器扩展)。

正如您已经使用没有名称的struct将其成员注入联盟的命名空间,因此您也可以使用没有名称的union来注入成员进入封闭的命名空间。像这样:

struct T {
    union {
        unsigned int x;
        struct {
            unsigned short xhigh;
            unsigned short xlow;
        };
    }; /* <-- no name here */

    /* ...repeated a handful of times for different variables in T... */
};

您只需要确保没有注入的名称与其他注入的名称或常规名称冲突,否则它将无法编译。

但有一个问题是:你似乎依赖于&#34;事实&#34; unsigned short的大小只有unsigned int的一半,而且这些类型都是大端的。但是,如果你的系统发生了什么,那就没关系了。如果没有,我建议你重新考虑结构。