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

Ale*_*lex 29 c c++ initialization unions c++03

我已经在定义为的头文件中构建了一个使用常量的工作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 } };
Run Code Online (Sandbox Code Playgroud)

我知道.raw初始化程序只是C语法.

如何在其中使用联合定义常量,以便我可以在C和C++中使用它们.

小智 16

我有同样的问题.对于C89,以下情况属实:

使用C89样式的初始值设定项,必须按声明的顺序初始化结构成员,并且只能初始化union的第一个成员

我在下面找到了这样的解释: 结构和联合的初始化


Ker*_* SB 5

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

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

    Foo() : raw{} { }
};
Run Code Online (Sandbox Code Playgroud)

这默认初始化了一个类型Foo为 active member的 union raw,它的所有元素都被初始化为零。(在 C++11 之前,无法初始化不是完整对象的数组。)

  • 警告:添加构造函数会删除 PODness,这在处理内存访问联合时通常是可取的。 (3认同)
  • @Offirmo C++11 引入了一个新术语 *standard-layout class* ,这些允许有构造函数;许多在 C++03 中需要 POD 的情况现在只需要标准布局。(POD 现在被定义为标准布局加上一些其他保证)。 (2认同)