[英]gcc doesn't warn about calling a nullary function WITH parameters?
任何人都可以告訴我,為什么在大火中GCC(例如4.4.3)沒有警告或錯誤的錯誤調用Nullary函數?
void hello() {
}
int main( int argc, char* argv[] ) {
int test = 1234;
hello(test);
return 0;
}
(另見http://bytes.com/topic/c/answers/893146-gcc-doesnt-warn-about-calling-nullary-function-parameters )
因為:
void hello() {
並不意味着你的想法。 使用:
void hello( void ) {
沒有虛空,你說你不能打擾指定參數。 請注意,這是C與C ++不同的眾多方式之一。
在C中, void hello()
聲明一個函數hello()
,它返回一個void
並獲取unspecified number of arguments.
注意
在C ++中,它們共同構成了一個不同的場景。 C ++中的void hello()
聲明一個函數hello()
,它返回一個void
並且no arguments.
根據我從C Book 4.2中收集的內容,您的函數定義不是原型,因為它沒有為參數指定類型信息。 這意味着編譯器只記住返回類型,並且不保留任何關於參數的信息。
這種形式的定義仍然允許向后兼容,並且不限於不帶參數的函數。 gcc同樣會允許類似的東西
void hello( a ) {
}
int main( int argc, char* argv[] ) {
int test = 1234;
hello(test,1);
return 0;
}
這里只有缺少類型信息的參數才是重要的。 要解決此問題並確保gcc在使用函數時檢查參數,您可以將類型信息放在函數聲明或定義中。 你最好把它們放在兩者中。
所有這些仍然沒有真正回答你的問題,為什么gcc沒有警告你。 必須是gcc團隊認為仍有足夠的舊式C代碼來證明默認情況下抑制警告的情況。 IMO我很驚訝-Wstrict-prototype
提到的-Wstrict-prototype
選項默認不啟用。
哈,前幾天我有這個。
您的定義必須是:
void hello(void);
否則該函數可以接受任意數量的參數。
但我明白你的觀點。 幾乎沒有任何編譯器甚至會對它提出絲毫警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.