Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中静态常量结构中的强制成员初始化_C_Struct_Initialization - Fatal编程技术网

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
};