我在定义为
的头文件中构建了一个使用常量的工作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 ++中使用它们。
答案 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 } };