【问题标题】:Initialize union inside of struct: cannot find why Missing brace around initializer在结构内初始化联合:找不到初始化器周围缺少大括号的原因
【发布时间】:2020-07-17 09:42:50
【问题描述】:

我正在尝试正确初始化这个结构:

typedef struct
{
    TU_ApplicationData uApplicationData;
    TS_SHA_Padding sSHA_Padding;
    TU_ApplicationNonVolatileData uApplicationNonVoltatileData;
    TS_SHA_Digest sSHA_Digest;
}TS_ApplicationFooter;

如你所见,它是由其他结构组成的:

typedef struct
{
    uint32_t u32ApplicationVersion_Major;
    uint32_t u32ApplicationVersion_Minor;
    fpJumpHandler fpApplicationJumpHandler;
    uint32_t u32BootApplicationStartAddress;
    uint32_t u32BootApplicationAllocationSize;
    uint32_t u32UserApplicationStartAddress;
    uint32_t u32UserApplicationAllocationSize;
}TS_ApplicationData;

typedef union
{
    uint32_t au32ApplicationData[32];
    TS_ApplicationData sApplicationData;
}TU_ApplicationData;

typedef struct
{
    uint32_t u32SHA_1PaddingBytes[16];
}TS_SHA_Padding;

typedef struct
{
    uint8_t u8ApplicationNonVoltatileData[256];
}TU_ApplicationNonVolatileData;

typedef struct
{
    uint32_t au32ApplicationHashTag[16];
}TS_SHA_Digest;

我找不到初始化 TS_ApplicationFooter 结构的正确方法。我拥有的最佳方法如下,但它返回警告:“初始化器 [-Wmissing-braces] 周围缺少大括号”。

const TS_ApplicationFooter sUserApplicationFooter =
{ /* Warning point here */
    .uApplicationData=
    {
        .au32ApplicationData={0},
        .sApplicationData=
        {
            .u32ApplicationVersion_Major=U32_USB_CDC_USER_APP_SW_RELEASE_MAJOR_VERSION,
            .u32ApplicationVersion_Minor=U32_USB_CDC_USER_APP_SW_RELEASE_MINOR_VERSION,
            .fpApplicationJumpHandler=NULL,
            .u32BootApplicationStartAddress=U32_BOOT_LOADER_APPLICATION_START_ADDRESS,
            .u32BootApplicationAllocationSize=U32_BOOT_LOADER_APPLICATION_ALLOCATED_SIZE,
            .u32UserApplicationStartAddress=U32_USER_APPLICATION_START_ADDRESS,
            .u32UserApplicationAllocationSize=U32_USER_APPLICATION_ALLOCATED_SIZE
        }
    },
    .sSHA_Padding={0},
    .uApplicationNonVoltatileData={0},
    .sSHA_Digest={0}
};

您知道如何在没有任何此类警告的情况下初始化此结构吗?

【问题讨论】:

    标签: c struct union


    【解决方案1】:

    您应该在最后三个成员周围添加额外的大括号以安抚 GCC:

        ...
        .sSHA_Padding={{0}},
        .uApplicationNonVoltatileData={{0}},
        .sSHA_Digest={{0}}
    };
    

    这可能是bug in GCC。即使使用-Wall -W -Wmissing-braces -pedantic 编译,Clang 也不会显示此警告。

    另外,由于一旦初始化结构的一个成员成员,所有其他未显式初始化的成员都将初始化为零,您可以省略它们。

    此外,您应该只初始化一个工会的成员!我建议你像这样重写整个初始化:

    const TS_ApplicationFooter sUserApplicationFooter =
    {
        .uApplicationData =
        {
            .sApplicationData =
            {
                .u32ApplicationVersion_Major = U32_USB_CDC_USER_APP_SW_RELEASE_MAJOR_VERSION,
                .u32ApplicationVersion_Minor = U32_USB_CDC_USER_APP_SW_RELEASE_MINOR_VERSION,
                .u32BootApplicationStartAddress = U32_BOOT_LOADER_APPLICATION_START_ADDRESS,
                .u32BootApplicationAllocationSize = U32_BOOT_LOADER_APPLICATION_ALLOCATED_SIZE,
                .u32UserApplicationStartAddress = U32_USER_APPLICATION_START_ADDRESS,
                .u32UserApplicationAllocationSize = U32_USER_APPLICATION_ALLOCATED_SIZE
            }
        },
    };
    

    【讨论】:

    • @Sliepen,我认为您不需要围绕一维数组使用额外的大括号。另外,我明白你关于联合的观点,但为什么只初始化 uApplicationData?您还应该初始化其余的 TS_ApplicationFooter 结构成员(sSHA_Padding、uApplicationNonVoltatileData 和 TS_SHA_Digest sSHA_Digest)
    • @Alex:你是对的,它似乎是 GCC 中的一个错误!我更新了答案。关于不初始化其余部分:一旦初始化结构的一个成员,所有成员都将被初始化。那些未显式初始化的将被初始化,就好像它们被声明为静态一样。见en.cppreference.com/w/c/language/struct_initialization
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多