gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:00:52 25 4
gpt4 key购买 nike

我有一些代码与下面的非常相似

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。到目前为止一切顺利。

但是,如果我能在想要以 unsigned int 形式访问 union 值的常见情况下只执行 t.x,我真的会很高兴 数量,但保留独立访问高阶和低阶部分的能力,无需诉诸位屏蔽和移位,也无需调用未定义的行为。

这在 C 中可能吗?

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

当我尝试简单地访问 t.x 而不是 t.x.x 的幼稚方法时,我收到类似这样的警告消息(这个特殊消息来自 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 就是一回事。

正如您使用没有名称的 struct 将其成员注入(inject) union 的命名空间一样,您也可以使用没有名称的 union 将其成员注入(inject)它的成员进入封闭的命名空间。像这样:

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... */
};

您只需要确保没有任何注入(inject)的名称与其他注入(inject)的名称或那里的常规名称冲突,否则将无法编译。


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

关于c - 如何在不命名的情况下访问 union 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44015642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com