[英]gcc compiler report warning but a.out works smoothly otherwise
我正在阅读《 C Primer Plus》这本书,并遇到了如下代码片段:
// designate.c -- use designated initializers
#include <stdio.h>
#define MONTHS 12
int main(void)
{
int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
int i;
for (i = 0; i < MONTHS; i++)
printf("%2d %d\n", i+1, days[i]);
return 0;
}
编译时报告错误:
$ cc designate.c
designate.c:6:57: warning: initializer overrides prior initialization of this subobject [-Winitializer-overrides]
int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
^~
designate.c:6:29: note: previous initialization is here
int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
^~
1 warning generated.
尽管如此,。/ ./a.out
可以正常工作。
$ ./a.out
1 31
2 29
3 0
4 0
5 31
6 30
7 31
8 0
9 0
10 0
11 0
12 0
我对从错误报告中学到什么感到非常困惑。
的确,警告经常是关于严重问题的,但这只是说您所做的事情没有多大意义,可能是疏忽大意。 特别
int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
在这里,我们具有28
为元件1,然后你它覆盖到29
与[1] = 29
。 这样28
就不见了,这就是警告您的地方。 转换为:
int days[MONTHS] = {31, 29, 0, 0, 31, 30, 31};
从结果中可以看出:
1 31
2 29
3 0
4 0
5 31
6 30
28
确实不见了。 编译器不知道28
对您有多重要,也许这很重要, [1] = 29
是一个错字。 这就是为什么它警告您。 正如您还看到的那样,三月和四月的持续时间为0
天有些令人不安,这肯定不是您想要的。
好吧,您设置arr [0] = 31,arr [1] = 28,arr [4] = 31,依此类推。 设置[1] = 29时,将var重置为arr [1],即28到29。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.