我将C99代码移植到C ++(14或17),并且在许多地方都使用了列表初始化程序。现在,我遇到了编译错误,并且想知道初始化结构嵌套的联合的最简单方法。例如,下面的C代码片段可以正常工作:
#include <stdint.h>
typedef union Word_t
{
uint32_t word32Bits;
struct
{
uint16_t leastSignificant16Bits;
uint16_t mostSignificant16Bits;
};
} Word_t;
int main()
{
Word_t w1 = (Word_t) {.word32Bits = 0x1234ABCD};
printf("%x\n",w1.word32Bits);
Word_t w2 = (Word_t) {.mostSignificant16Bits = 0x1234,.leastSignificant16Bits = 0xABCD};
printf("%x\n",w2.word32Bits);
return 0;
}
$ gcc test.c --std=c99 -o a && ./a
1234abcd
1234abcd
但是,在C ++中无法编译:
#include <stdint.h>
typedef union Word_t
{
uint32_t word32Bits;
struct
{
uint16_t leastSignificant16Bits;
uint16_t mostSignificant16Bits;
} _word16Bits;
} Word_t;
int main()
{
Word_t w1 = (Word_t) {.word32Bits = 0x1234ABCD};
printf("%x\n",w2.word32Bits);
return 0;
}
```bash
$ g++ test.c --std=c++14 -o a && ./a
test.c: In function ‘int main()’:
test.c:57:92: error: ‘Word_t’ has no non-static data member named ‘mostSignificant16Bits’
Word_t w2 = (Word_t) {.mostSignificant16Bits = 0x1234,.leastSignificant16Bits = 0xABCD};
我发现的工作量解决方案是将其初始化为零,然后按如下所示设置结构的内部值:
int main()
{
Word_t w1 = (Word_t) {.word32Bits = 0x1234ABCD};
printf("%x\n",w1.word32Bits);
Word_t w2 = (Word_t) {.mostSignificant16Bits = 0x1234,.leastSignificant16Bits = 0xABCD};
Word_t w2 = {0};
w2._word16Bits = {0x1234,0xABCD};
return 0;
}
这是可行的,但是例如,它不允许我明确说出.mostSignificant16Bits = 0x1234
,我认为这很有用,尤其是在阅读代码时。
我尝试了一些事情,例如定义静态成员,创建用户定义的构造函数,但仍然不知道如何简化我要做的重构。理想情况下,我想保留变量声明的原样Word_t w2 = (Word_t) {.mostSignificant16Bits = 0x1234,.leastSignificant16Bits = 0xABCD}
,而所有更改都在Word_t
的定义中完成。