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

时间:2012-07-19 07:16:10

标签: 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 } };

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

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

4 个答案:

答案 0 :(得分:15)

我遇到了同样的问题。对于C89,以下情况属实:

  

使用C89样式的初始化程序,必须初始化结构成员   声明的顺序,只有union的第一个成员可以   初始化

我在以下地址找到了这个解释: Initialization of structures and unions

答案 1 :(得分:3)

我相信C ++ 11允许你编写自己的构造函数,如下所示:

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

    Foo() : raw{} { }
};

此默认值初始化类型为Foo的联合,其活动成员raw具有零初始化的所有元素。 (在C ++ 11之前,没有办法初始化不是完整对象的数组。)

答案 2 :(得分:2)

我决定选择以下路径。

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

而是声明全局变量:

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

并在全局部分初始化它:

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

而不是用现代的ANSI C99语法来窃听C ++编译器,而是让链接器做的工作就是解码C符号。

答案 3 :(得分:1)

C89允许通过直接列出要初始化的元素来初始化联合(就像您在代码中所拥有的那样)。 C99改变了这一点,这样你就可以通过它的第一个元素来建立联盟。

C ++只允许这种形式的初始化 - 由第一个元素组成。所以这是适用于任何一种情况的代码:

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