c中静态常量结构中的强制成员初始化
我使用c中静态常量结构中的强制成员初始化,c,struct,initialization,C,Struct,Initialization,我使用structs存储不同的配置,我想强制初始化所有成员。我的意思是,不要让编译器去做(归零),而是让程序员去做 编译器错误最好,但警告也可以。我用Segger clang做手臂 关于如何做到这一点,有什么建议吗 由于我想使用指定的初始值设定项,-Wmissing字段初始值设定项在这种情况下不起作用。见: 没有特别优雅的方法可以通过编程实现这一点。最好的办法是使用静态初始化工具。(例如,可以检查MISRA-C:2012规则,要求必须显式初始化结构的所有元素。) 使用纯标准C,那么。。。 因为这
struct
s存储不同的配置,我想强制初始化所有成员。我的意思是,不要让编译器去做(归零),而是让程序员去做
编译器错误最好,但警告也可以。我用Segger clang做手臂
关于如何做到这一点,有什么建议吗
由于我想使用指定的初始值设定项,-Wmissing字段初始值设定项在这种情况下不起作用。见:
没有特别优雅的方法可以通过编程实现这一点。最好的办法是使用静态初始化工具。(例如,可以检查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初始值设定项的数目错误。”
-Wmissing字段初始值设定项是否有帮助?@EugeneSh。nops,来自:此选项不会警告指定的初始值设定项,因此以下修改不会触发警告:struct s{int f,g,h;};结构sx={.f=3.g=4}代码>在这种情况下它将发出警告:const config\u t config\u 1={20}代码>在//这应该会生成一个警告
您的意思是因为您没有显式初始化成员选项_1
?它隐式初始化为0
,即使是局部变量。就像你说的@WeatherVane,我并没有显式初始化每个成员。我想警告一下。@koder,因为它想确保如果有人创建了一个新配置,他们不会错过一些字段。或者,如果将字段添加到结构中,则必须将其添加到所有配置中。
#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
};