将变量转换为结构定义中定义的union-type

问题描述 投票:0回答:2

实际上我在C中遇到一些困难,无法将unsigned int变量强制转换为union-type,它在结构类型的声明中声明。

我需要以相同的方式设置变量,比如编写结构中定义的并集的字段。

包含头文件中的声明:

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的内部union-types来修改“dummyVar”的值?是否可以将变量转换为结构中定义的并集并访问子结构的字段?

如果可以像下面所示或以类似的方式修改变量,那将非常有用:

((<CAST>) dummyVar).UNION.SUB_STRUCT.UPPER = some_value;

注意: - 无法更改STRUCT_TYPE的声明。 - 无法编写或编辑结构pStructure。 - pStructure的访问行为需要再现到dummyVar。

无论如何这在C中是否可行?

先感谢您!

马丁

c struct casting union typedef
2个回答
1
投票

可以使用结构类型STRUCT_TYPE的内部union-types来修改“dummyVar”的值?

可能不是,因为你有这个:

typedef struct {
    [...]

    union {

我假设[...]意味着有结构成员放在那里。

是否可以将变量转换为结构中定义的并集并访问子结构的字段?

除非它是结构的初始部分,否则它是有问题的。将联合分解为一个与结构没有紧密耦合的单独的typedef可能更聪明。

此外,联合使用的位字段不是标准化的,您无法知道它们如何以内存方式结束在内存中。

在这里做的聪明的事情可能是忘记所有关于结构的事情并且干脆做

uint32_t u32 = ...
uint16_t ms = u32 >> 16;
uint16_t ls = u32 & 0xFFFFu;

无论位域实现和字节顺序如何,此代码都是可移植的。


1
投票

可以使用结构类型STRUCT_TYPE的内部union-types来修改“dummyVar”的值?

尽管不考虑大小和表示的所有考虑,否则,在示例中不可能向内部联合类型转换任何内容,因为类型转换只适用于标量类型。有些游戏你可以玩指针和脆弱的代码重复,但我强烈建议反对这样的恶作剧,我拒绝提供一个例子。

但是,如果要将dummyVar的值设置为STRUCT_TYPE.UNION.COMPLETE_VALUEUPPER的某些特定值的LOWER值,那么在C99及更高版本中,您可以通过复合文字来实现:

dummyVar = ((STRUCT_TYPE) { .UNION = { .SUB_STRUCT = { some_upper, some_lower } } }).UNION.COMPLETE_VALUE;

请注意,虽然(STRUCT_TYPE)片段类似于演员,但它只是复合文字语法的一部分。您不能转换为结构类型,只能转换为联合类型。

或者,在未定义STRUCT_TYPE的翻译单元中,您可以为内部联合类型编写复合文字,但情况会更糟。由于该类型没有标记或别名,因此该类型的复合文字需要重现其完整定义。这种复合文字的类型在技术上与任何翻译单元中的结构成员的类型都不兼容,其中两者都是定义的,但实际上,我认为没有任何理由怀疑你会得到dummyVar的相同值无论哪种方式。

© www.soinside.com 2019 - 2024. All rights reserved.