在c中的静态const结构中强制成员初始化

Posted

技术标签:

【中文标题】在c中的静态const结构中强制成员初始化【英文标题】:Force member initialization in static const struct in c 【发布时间】:2021-04-13 07:21:25 【问题描述】:

我使用structs 来存储不同的配置,我想强制初始化所有成员。我的意思是不要让编译器这样做(归零),而是让程序员明确地这样做。

编译器错误最好,但警告也可以。我正在使用 Segger clang 作为手臂。

关于如何实现这一点的任何提示?

由于我想使用指定的初始化器,-Wmissing-field-initializers 在这种情况下不起作用。见:Docs

typedef struct
    int option_1,
    int option_2,
    ....
 config_t;

// this is fine
const config_t config_1 = 
    .option_1 = 10,
    .option_2 = 20,
;

// this should generate a warning
const config_t config_1 = 
    .option_2 = 20,
;

【问题讨论】:

-Wmissing-field-initializers 有帮助吗? @EugeneSh。 nops,来自documentation:此选项不会对指定的初始化程序发出警告,因此以下修改不会触发警告:struct s int f, g, h; ; struct s x = .f = 3, .g = 4 ;在这种情况下会发出警告:const config_t config_1 = 20; // this should generate a warning 中你的意思是因为你没有明确地初始化成员option_1?即使是局部变量,它也会隐式初始化为 0 就像你说的@WeatherVane,我没有明确初始化每个成员。我想对此提出警告。 @koder 因为它想确保如果有人创建了新配置,他们不会错过某些字段。或者,如果将字段添加到结构中,则必须将它们添加到所有配置中。 【参考方案1】:

没有特别优雅的方式以编程方式执行此操作。最好的办法是使用静态初始化工具。 (例如,可以检查 MISRA-C:2012 规则,要求结构的所有元素都必须显式初始化。)

使用纯标准 C,嗯... 由于这个结构没有任何填充,我想你可以像这样编造一些相当丑陋的东西:

#define CONFIG_INIT_LIST1 10, 20
#define CONFIG_INIT_LIST2 10

_Static_assert(sizeof (int[])CONFIG_INIT_LIST1 == sizeof (config_t),
               "CONFIG_INIT_LIST1 wrong number of initializers.");
_Static_assert(sizeof (int[])CONFIG_INIT_LIST2 == sizeof (config_t),
               "CONFIG_INIT_LIST2 wrong number of initializers.");

// this is fine
const config_t config_1 = 
    CONFIG_INIT_LIST1
;

const config_t config_2 = 
    CONFIG_INIT_LIST2
;

这会导致编译器错误

错误:静态断言失败:“CONFIG_INIT_LIST2 初始化器数量错误。”

【讨论】:

以上是关于在c中的静态const结构中强制成员初始化的主要内容,如果未能解决你的问题,请参考以下文章

为啥允许在这里用非 const 初始化静态变量?

如何使用C ++中的某个语句初始化类const static结构

static const readonly

C++面向对象-static、const

C++类和对象下

如何更改静态链接库中 const 字符串数组的 Visual Studio C++ 初始化序列