使用嵌套结构初始化并集

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

我正在将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", w1.word32Bits);

    Word_t w2 = (Word_t) {.mostSignificant16Bits = 0x1234, .leastSignificant16Bits = 0xABCD};
    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

我正在将C99代码移植到C ++(14或17),并且在许多地方都使用了列表初始化程序。现在我遇到编译错误,并且想知道初始化由...

c++ c union porting
2个回答
0
投票

语法问题


-2
投票

这在C和C ++中有效:

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