2013-07-07 43 views
3

考慮這個C程序:隱式函數聲明在C89中是否合法?

int main() 
{ 
    puts("Hello world!"); 
    return 0; 
} 

這編譯和運行細而據我所知,是合法的C89。但是,我不是100%確定的。在C99模式下使用clang編譯通知我implicit declaration of function 'puts' is invalid in C99(這使我認爲C標準必須在C99中更改以使隱式函數聲明非法,這正是我試圖確認的內容)。

隱式函數聲明在C89中合法嗎? (即使這樣做是一個壞主意(除非你在混淆的C代碼挑戰中))

+1

[對類似問題的回答](http://stackoverflow.com/a/437763)可能會對您有所幫助。 – Frxstrem

回答

7

隱式函數聲明在C89中是合法的嗎?

是的。從section 3.3.2.2

如果之前的括號參數列表中 函數調用只包括一個標識符,如果沒有 聲明是該標識符可見,標識符 隱式聲明的表達完全一樣,在含有 函數調用,聲明

extern int identifier(); 

出現的最內塊。

+0

優秀的答案,謝謝! – Cornstalks

+2

在這種特殊情況下,它只有因'puts'碰巧返回'int'結果而具有良好定義的行爲。對於非'int'函數,行爲將是未定義的。無論如何,最好只添加'#include '。 –

+0

另外,即使在C89中,使用'printf()'也會引發未定義的行爲,因爲必須正確聲明變量參數列表函數,例如'printf()'。在沒有範圍的情況下調用它們不是一個好主意。 –

1

函數的隱式聲明在C89中是合法的,但在C99中被刪除。這可以在C11(ISO/IEC 9899:201x)標準中確認。

在C11 正向部分,它列出了第三版(即C11)所有的重大變化和第二版(即C99),其中之一是:

重大變化在第二版中包括:

...

- 刪除隱函數聲明

此外,在Rationale for International Standard Programming Languages C§6.5.2.2函數調用

C99的新功能:用於功能隱式聲明的規則已在C99被刪除。這樣做的效果是保證生成一個能夠捕獲另一類編程錯誤的診斷。在發佈診斷之後,實現可以選擇承擔隱式聲明並繼續翻譯以支持利用此功能的現有程序。