5

我是一个 C 源代码,我想确保我的结构的所有元素都被很好地初始化。警告 Wmissing-field-initializers 会很容易。但我也希望能够使用指定的初始化程序来初始化我的元素。

例如:

struct s {
  int a;
  int b;
};

struct s s1 = { .a = 1, .b = 2 };
struct s s2 = { .a = 1 };
struct s s3 = { 1, 2 };
struct s s4 = { 1 };

让我们尝试编译它:

$ gcc -Wmissing-field-initializers -c struct_init.c 
struct_init.c:9:8: warning: missing initializer
struct_init.c:9:8: warning: (near initialization for ‘s4.b’)

我也希望 s2 初始化的编译失败。我更喜欢指定的初始化,因为它有利于源代码的阅读。

4

2 回答 2

4

当您使用指定初始值设定项时,缺少的成员将被初始化为0. 即使对象具有自动存储持续时间也是如此。据我所知,当您使用指定初始值设定项时,没有gcc选项可以警告显式初始化的成员。

于 2013-01-02T13:38:11.003 回答
2

您可以使用 -Werror 将警告转换为错误,或者使用 -Werror=missing-field-initializers 仅将字段初始值设定项警告转换为错误。

更多信息:GCC 警告选项

编辑:我刚刚使用夹板运行了一个测试,没有其他选项,它给出了以下输出:

main.c:13:17: Initializer block for s2 has 1 field, but struct s has 2 fields:
             <error>
  Initializer does not set every field in the structure. (Use -fullinitblock to
  inhibit warning)
main.c:15:17: Initializer block for s4 has 1 field, but struct s has 2 fields:
             1

它可能不是您所追求的,因为您需要针对您的源手动运行它,但它会警告缺少指定的初始化程序。

于 2013-01-02T13:45:34.167 回答