簡體   English   中英

gcc沒有警告調用帶有參數的nullary函數?

[英]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.

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