【发布时间】:2019-03-19 13:15:50
【问题描述】:
实际上,我在 C 中将 unsigned int 变量转换为在结构类型声明中声明的联合类型有一些困难。
我需要像编写结构中定义的联合字段一样设置变量。
在包含的头文件中声明:
typedef struct {
[...]
union {
unsigned long COMPLETE_VALUE;
struct {
unsigned long UPPER:16; /* [15:0] */
unsigned long LOWER:16; /* [31:16] */
} SUB_STRUCT;
} UNION;
[...]
} STRUCT_TYPE;
c 源文件中的变量:
STRUCT_TYPE *pStructure; /* the reference structure */
unsigned long dummyVar; /* dummy variable */
/* writing the upper field in the structure */
pStructure->UNION.SUB_STRUCT.UPPER = some_value;
问题: 是否可以使用结构类型 STRUCT_TYPE 的内部联合类型来修改“dummyVar”的值? 是否可以将变量强制转换为结构内定义的联合并访问子结构的字段?
如果可以如下所示或以类似方式修改变量,那将非常有用:
((<CAST>) dummyVar).UNION.SUB_STRUCT.UPPER = some_value;
注意事项: - STRUCT_TYPE 的声明不能更改。 - 结构 pStructure 不能被写入或编辑。 - pStructure 的访问行为需要复制到 dummyVar。
这在 C 中是否可能?
提前谢谢你!
马丁
【问题讨论】:
-
你的代码确实犯了一个很大的错误:它假设
sizeof(long) == 4。情况并非总是如此。除了char(其中sizeof(char) == 1始终为真)之外,C 中没有任何内置类型具有固定大小。你只知道sizeof(char) <= sizeof(short) && sizeof(short) <= sizeof(int) && sizeof(int) <= sizeof(long) && sizeof(long) <= sizeof(long long)。sizeof(long) == 8在 64 位系统上并不少见。 -
至于你的问题,是你的问题是什么?我的意思是,您试图解决的原始问题是什么? 为什么您想使用
dummyVar作为联合体?为什么不能只使用简单的按位运算(如uint32_t dummyVar = 0; dummyVar |= (some_value << 16);)? -
或者更重要的是,在 64 位系统上
sizeof(long) == 4是不常见的(仅在 Windows 上!) -
虽然
char的大小定义了测量其他大小的单位,即使它没有固定的位数。 -
UPPER:16; /* [15:0] */无论字节顺序如何都是完全错误的。你怎么知道位域中的哪些 16 位是哪些位?它不是由 C 语言指定的。
标签: c struct casting union typedef