我已经构建了一个工作 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++ 中使用它们。
我也有同样的问题。对于 C89,以下情况正确:
使用 C89 风格的初始化器,结构成员必须在以下位置初始化: 声明的顺序,并且只有联合体的第一个成员可以 已初始化
我在以下位置找到了这个解释: 结构和联合的初始化
我相信 C++11 允许你像这样编写自己的构造函数:
union Foo
{
X x;
uint8_t raw[sizeof(X)];
Foo() : raw{} { }
};
此默认初始化类型为
Foo
与活动成员 raw
的联合,其中所有元素都初始化为零。 (在 C++11 之前,无法初始化不完整对象的数组。)
我决定选择以下道路。
.member
初始化。static const struct Foobar
成员初始化而是声明全局变量:
extern "C" {
extern const struct Foobar foobar;
}
并在全局部分中初始化它:
struct Foobar foobar = { 0, 0, 0, 0 };
并且我没有使用现代 ANSI C99 语法来干扰 C++ 编译器,而是让链接器完成对 C 符号进行整理的工作。
这是我的例子如何在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;
}