加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:06:30 所属栏目:百科 来源:网络整理
导读:我有一些代码与以下非常相似 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类型的
我有一些代码与以下非常相似

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.x或t.x.xhigh或t.x.xlow.到现在为止还挺好.

但是,我真的很喜欢它,如果我只想在需要访问union的值作为unsigned int数量的常见情况下执行tx,但保留能够独立访问高阶和低阶部分而无需求助于位掩码和移位,并且不调用未定义的行为.

这可能在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会产生相同的警告.

解决方法

如果您可以使用匿名结构(它们都是C11功能或编译器扩展),匿名联合是一件事.

正如您使用没有名称的结构将其成员注入到union的名称空间中一样,因此您也可以使用没有名称的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... */
};

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

但是有一个问题是:你似乎依赖于“unsigned short”是unsigned int大小一半的“事实”,而且这些类型都是big-endian.但如果这是您系统上发生的事情,那就没关系.如果没有,我建议你重新考虑结构.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读