使用gcc -std=c99 -Wextra
编译以下代码:
#include <stdio.h>
struct T {
int a;
int *b;
int c;
};
int main(void)
{
struct T t = {.b = ((int []){1, 1})};
printf("%d\n", t.b[1]);
return 0;
}
这给了我一个警告:
demo.c:11:12: warning: missing initializer for field ‘c’ of ‘struct T’ [-Wmissing-field-initializers]
struct T t = {.b = ((int []){1, 1})};
^
demo.c:6:9: note: ‘c’ declared here
int c;
^
但指定初始值器应初始化剩余成员,即使它们被省略也应初始化为零。
为什么会有警告?(clang
编译相同的代码不会出现警告)
gcc version 6.3.0 20170516 (Debian 6.3.0-18)
clang version 3.8.1-24 (tags/RELEASE_381/final)
struct T t = {.b = &t.a };
不会生成警告。一个单元素数组(复合字面量)也足够了。它似乎只是“仅在用复合字面量初始化后的元素之后”的问题。在c
之后添加int d;
,则不会有关于d
的投诉。(在复合字面量之前或之后添加更多整数,仍然只有在复合字面量之后的一个元素会受到投诉。) - Jonathan Lefflerstruct T { int a; int *b; int c; int *e; /* int f; */ };
和struct T t = {.b = ((int []){1, 1}), .e=((int []){2,3})};
不会报错。但是如果移除注释,它就会报e
的错误,而不再是b
的错误了。 - user2736738#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
在每个文件的基础上抑制警告,作为(临时)解决方法。 - Will