在c中的静态const结构中强制成员初始化
Posted
技术标签:
【中文标题】在c中的静态const结构中强制成员初始化【英文标题】:Force member initialization in static const struct in c 【发布时间】:2021-04-13 07:21:25 【问题描述】:我使用struct
s 来存储不同的配置,我想强制初始化所有成员。我的意思是不要让编译器这样做(归零),而是让程序员明确地这样做。
编译器错误最好,但警告也可以。我正在使用 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结构中强制成员初始化的主要内容,如果未能解决你的问题,请参考以下文章