簡體   English   中英

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};

在這里,我們具有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM