【问题标题】:Force member initialization in static const struct in c在c中的静态const结构中强制成员初始化
【发布时间】: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 因为它想确保如果有人创建了新配置,他们不会错过某些字段。或者,如果将字段添加到结构中,则必须将它们添加到所有配置中。

标签: c struct initialization


【解决方案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 初始化器数量错误。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2012-02-02
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多