gcc 编译器报告警告但 a.out 否则工作顺利
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};
此处元素 1 为 28
,然后用 [1] = 29
将其覆盖为 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
是一个错字。这就是它警告你的原因。正如您还看到的那样,3 月和 4 月有 0
天的时间,这肯定不是您想要的。
嗯,你设置arr[0]= 31, arr[1] =28, arr[4]= 31等等。当您设置 [1] = 29 时,您将 var 重置为 arr[1],它是 28 到 29.
我正在跟书"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};
此处元素 1 为 28
,然后用 [1] = 29
将其覆盖为 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
是一个错字。这就是它警告你的原因。正如您还看到的那样,3 月和 4 月有 0
天的时间,这肯定不是您想要的。
嗯,你设置arr[0]= 31, arr[1] =28, arr[4]= 31等等。当您设置 [1] = 29 时,您将 var 重置为 arr[1],它是 28 到 29.