C 将变量强制转换为结构定义中定义的联合类型
实际上,在C语言中,我很难将一个无符号int变量转换为在结构类型声明中声明的联合类型 我需要以与编写结构中定义的并集字段相同的方式设置变量 包含的头文件中的声明:C 将变量强制转换为结构定义中定义的联合类型,c,struct,casting,union,typedef,C,Struct,Casting,Union,Typedef,实际上,在C语言中,我很难将一个无符号int变量转换为在结构类型声明中声明的联合类型 我需要以与编写结构中定义的并集字段相同的方式设置变量 包含的头文件中的声明: typedef struct { [...] union { unsigned long COMPLETE_VALUE; struct { unsigned long UPPER:16; /* [15:0] */
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;
(()dummyVar).UNION.SUB_STRUCT.UPPER=某个值;
注:
-无法更改STRUCT_类型的声明。
-无法写入或编辑结构PST。
-pStructure的访问行为需要复制到dummyVar
这在C语言中是可能的吗
提前谢谢你
马丁
可以使用结构类型STRUCT_type的内部联合类型修改“dummyVar”的值
可能不会,因为您有:
typedef struct {
[...]
union {
我假设[…]
意味着存在放置在那里的结构成员
是否可以将变量强制转换为结构中定义的并集,并访问子结构的字段
除非它是结构的初始部分,即使如此,它也是有问题的。如果将联合作为一个单独的typedef进行分解,而不是与结构紧密耦合,可能会更明智
此外,union使用的位字段没有标准化,您无法知道它们如何以可移植的方式存储在内存中
这里要做的明智之举可能是忘记所有关于结构的内容,只需执行以下操作
uint32_t u32 = ...
uint16_t ms = u32 >> 16;
uint16_t ls = u32 & 0xFFFFu;
无论位域实现和endianess如何,此代码都是可移植的
可以使用结构类型STRUCT_type的内部联合类型修改“dummyVar”的值
可能不会,因为您有:
typedef struct {
[...]
union {
我假设[…]
意味着存在放置在那里的结构成员
是否可以将变量强制转换为结构中定义的并集,并访问子结构的字段
除非它是结构的初始部分,即使如此,它也是有问题的。如果将联合作为一个单独的typedef进行分解,而不是与结构紧密耦合,可能会更明智
此外,union使用的位字段没有标准化,您无法知道它们如何以可移植的方式存储在内存中
这里要做的明智之举可能是忘记所有关于结构的内容,只需执行以下操作
uint32_t u32 = ...
uint16_t ms = u32 >> 16;
uint16_t ls = u32 & 0xFFFFu;
无论位域实现和endianess如何,此代码都是可移植的
可以使用内部函数修改“dummyVar”的值
结构类型STRUCT_type的联合类型
尽管考虑了大小和表示形式,但在您的示例中不可能对内部联合类型强制转换任何内容,因为类型强制转换仅适用于标量类型。有些游戏可以使用指针和脆弱的代码复制,但我强烈建议不要使用这种诡计,我拒绝给出一个例子
但是,如果要将dummyVar
的值设置为与STRUCT\u TYPE.UNION.COMPLETE\u value
对应的值,以获得UPPER
和LOWER
的某些特定值,则在C99和更高版本中,您可以通过复合文字执行此操作:
dummyVar = ((STRUCT_TYPE) { .UNION = { .SUB_STRUCT = { some_upper, some_lower } } }).UNION.COMPLETE_VALUE;
请注意,尽管(STRUCT_TYPE)
片段类似于一个cast,但它只是复合文本语法的一部分。不能强制转换为结构类型,正如不能强制转换为联合类型一样
或者,在未定义STRUCT_TYPE
的翻译单元中,您可以为内部联合类型编写一个复合文本,但情况会更糟。由于该类型没有标记或别名,因此该类型的复合文字将需要复制其完整定义。这种复合文字的类型在技术上与定义了这两种文字的任何翻译单元中的结构成员的类型都不兼容,但作为一个实际问题,我认为没有任何理由怀疑,无论哪种方式,您都会得到相同的值
可以使用内部函数修改“dummyVar”的值
结构类型STRUCT_type的联合类型
尽管考虑了大小和表示形式,但在您的示例中不可能对内部联合类型强制转换任何内容,因为类型强制转换仅适用于标量类型。有些游戏可以使用指针和脆弱的代码复制,但我强烈建议不要使用这种诡计,我拒绝给出一个例子
但是,如果要将dummyVar
的值设置为与STRUCT\u TYPE.UNION.COMPLETE\u value
对应的值,以获得UPPER
和LOWER
的某些特定值,则在C99和更高版本中,您可以通过复合文字执行此操作:
dummyVar = ((STRUCT_TYPE) { .UNION = { .SUB_STRUCT = { some_upper, some_lower } } }).UNION.COMPLETE_VALUE;
请注意,尽管(STRUCT_TYPE)
片段类似于一个cast,但它只是复合文本语法的一部分。不能强制转换为结构类型,正如不能强制转换为联合类型一样
或者,在未定义STRUCT_TYPE
的翻译单元中,您可以为内部联合类型编写一个复合文本,但情况会更糟。由于该类型没有标记或别名,因此该类型的复合文字将需要复制其完整定义。这种复合文字的类型在技术上与任何翻译单元中的结构成员的类型都不兼容,但作为一个实际问题,我认为没有任何理由怀疑你会