2012-02-23 57 views
5

以下test.c程序爲什麼GCC針對未聲明的功能發出警告不一致?

int main() { 
    dummySum(1, 2); 
    return 0; 
} 

int dummySum(int a, int b) { 
    return a + b; 
} 

...當gcc -o test test.c編譯,而下面的人做不產生任何警告:

int main() { 
    dummySum(1, 2); 
    return 0; 
} 

void dummySum(int a, int b) { 
    a + b; 
} 

爲什麼?

+0

不是。我也是這麼想的。 'dummy'的'int'和'void'返回類型。 – mattjgalloway 2012-02-23 15:45:44

+1

未聲明函數的默認返回類型是int。當你將它聲明爲void時,它找不到任何匹配的函數。我相信如果你使用更強的警告檢查(例如-Wall),你會在任何情況下都會收到警告。 – Joe 2012-02-23 15:46:02

+1

在第一個帖子中是一樣的,你是對的。我編輯了這篇文章。對不起 – 2012-02-23 15:46:22

回答

8

當遇到未聲明函數,編譯器假定接受給定數量的參數(我認爲)返回int(這部分我敢肯定的)功能。你的第二個沒有,所以你得到重新定義警告。我相信,基於前面的一個非常快速的掃描,C99(PDF link)刪除了這一點。儘管GCC仍然允許他們(帶有警告),但這並不令人驚訝。我無法想象有多少代碼就開始無法編譯...


推薦使用-Wall(打開所有的警告),所以你得到巨大的附加信息的數量(您可以在當關閉特定的警告有一個真的很好的理由,無論你在做什麼,如果需要生成)。

+0

在C99中刪除了'implicit int',所以在嚴格的C99模式或C11模式下,它不應該編譯IMO。然而,海灣合作委員會編譯它,只是吐出一個警告(兩者)。 – 2012-02-23 17:05:15

+0

@DanielFischer:有趣!實際上,我只是看着C99,我認爲它比這更進一步:它完全消除了隱式函數聲明。 (有趣的是,前言分別列出了兩個項目,「刪除隱式」int「」和「刪除隱式函數聲明」)。我懷疑「implicit'int'」位指的是一個聲明的函數,但根本沒有任何返回類型。 – 2012-02-23 17:39:12

2

函數在聲明之前無法使用。當一個函數聲明是不可見的,實施在C89假定函數:

  • 需要的參數的指定(但固定的)數目

  • 返回int

這被稱爲隱式函數聲明

在C99中,函數的隱式聲明已經被刪除,並且實現可以自由地拒絕翻譯源代碼。

相關問題