我需要定义一个由2个24位字段(总共48位)组成的类型。我没有找到一种方法来使用结构中的位域来做到这一点。所以我用一个联合和 2 个匿名结构定义了我的类型:
typedef union
{
struct __attribute__((packed))
{
uint32_t a : 24,
: 8;
uint16_t : 16;
};
struct __attribute__((packed))
{
uint16_t : 16;
uint32_t : 8,
b : 24;
};
} myType;
这样我就可以直接从变量
a
访问 b
和 myType
:
myType var;
var.a = 0x123456;
var.b = 0x654321;
问题是当我在这种类型上使用初始化程序时,如下所示:
myType var = {
.a = 0x123456;
.b = 0x654321;
};
此处仅初始化字段
b
,因为 a
和 b
是联合的不同部分的一部分。这是编译器的正常行为,但有一个“override-init”警告会很有用。
如果我对这个联合内的命名结构执行相同的操作,我会收到该警告:
typedef union
{
struct __attribute__((packed))
{
uint32_t a : 24,
: 8;
uint16_t : 16;
} x;
struct __attribute__((packed))
{
uint16_t : 16;
uint32_t : 8,
b : 24;
} y;
} myType;
myType var = {
.x = { .a = 0x123456 };
.y = { .b = 0x654321 }; // warning: initialization field overwritten [-Woverride-init]
};
我不想在代码中使用命名结构,因为它们的名称是人为的(没有意义)。但如果我在代码中犯了这种类型的初始化错误,我希望收到该警告。
有没有办法通过匿名字段发出警告?
或者有更好的方法来定义我的类型吗?
不能同时初始化联合体的两个成员。你还需要再一份:
typedef union
{
struct
{
uint64_t a : 24,
uint64_t : 8;
uint64_t : 16;
} x;
struct
{
uint64_t : 16;
uint64_t : 8;
uint64_t b : 24;
} y;
struct
{
uint64_t initx : 24;
uint64_t inity : 24;
};
} myType;
myType var = {
.initx = 0x123456 ,
.inity = 0x654321
};