如何在不命名的情况下访问union的成员?
我有一些代码与以下非常相似
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.但如果这是您系统上发生的事情,那就没关系.如果没有,我建议你重新考虑结构. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |