C++ 和 C 中的联合初始化

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

我已经构建了一个工作 C 库,它使用常量,在头文件中定义为

typedef struct Y {
  union {
    struct bit_field bits;
    uint8_t raw[4];
  } X;
} CardInfo;

static const CardInfo Y_CONSTANT = { .raw = {0, 0, 0, 0 } };

我知道

.raw
初始化器仅是 C 语法。

如何定义带有联合的常量,以便我可以在 C 和 C++ 中使用它们。

c++ c initialization unions c++03
4个回答
24
投票

我也有同样的问题。对于 C89,以下情况正确:

使用 C89 风格的初始化器,结构成员必须在以下位置初始化: 声明的顺序,并且只有联合体的第一个成员可以 已初始化

我在以下位置找到了这个解释: 结构和联合的初始化


7
投票

我相信 C++11 允许你像这样编写自己的构造函数:

union Foo
{
    X x;
    uint8_t raw[sizeof(X)];

    Foo() : raw{} { }
};

此默认初始化类型为

Foo
与活动成员
raw
的联合,其中所有元素都初始化为零。 (在 C++11 之前,无法初始化不完整对象的数组。)


3
投票

我决定选择以下道路。

  • 请勿使用
    .member
    初始化。
  • 不要使用
    static const struct Foobar
    成员初始化

而是声明全局变量:

extern "C" {
  extern const struct Foobar foobar;
}

并在全局部分中初始化它:

struct Foobar foobar = { 0, 0, 0, 0 };

并且我没有使用现代 ANSI C99 语法来干扰 C++ 编译器,而是让链接器完成对 C 符号进行整理的工作。


0
投票

这是我的例子如何在C99中创建const union(也适用于C++)。

#include <stdio.h>
#include <stdint.h>

typedef union{
    uint16_t u16;
    uint8_t u8s[2];
}uint8_16_t;

int main()
{
    const uint8_16_t val= {.u8s={0xAA, 0xBB}};
    printf("%04X", val.u16);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.