GCC -Woverride-init 警告与联合中的匿名结构

问题描述 投票:0回答:1

我需要定义一个由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]
};

我不想在代码中使用命名结构,因为它们的名称是人为的(没有意义)。但如果我在代码中犯了这种类型的初始化错误,我希望收到该警告。

有没有办法通过匿名字段发出警告?
或者有更好的方法来定义我的类型吗?

c compiler-warnings anonymous-types gcc-warning
1个回答
0
投票

不能同时初始化联合体的两个成员。你还需要再一份:

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 
};
© www.soinside.com 2019 - 2024. All rights reserved.