2011-08-21 34 views
22

說我有這個功能:爲什麼我可以通過一個參數太多的指針來調用函數?

int func2() { 
    printf("func2\n"); 
    return 0; 
} 

現在我宣佈一個指針:

int (*fp)(double); 

這應該指向需要double參數並返回一個int的功能。

func2沒有任何說法,但仍當我寫:

fp = func2; 
fp(2); 

(與2是隻是一個任意數字),func2`正確調用。

這是爲什麼?對於我聲明的函數指針的參數數量是否沒有意義?

+0

簡短的答案是「聲明函數沒有參數...然後故意傳遞參數...是錯誤的」。 – paulsm4

回答

46

是的,有是一個意思。在C(但不是 C++),用空的圓括號聲明的函數意味着需要一個未指定數量的參數。當你這樣做時,你會阻止編譯器檢查參數的數量和類型;這是C語言在被ANSI和ISO標準化之前的延續。

未能用正確的數量和類型的參數調用函數導致未定義的行爲。如果不是明確聲明你的函數使用的void參數列表採取零個參數,那麼編譯器會給你一個警告,如果您分配了錯誤類型的函數指針:

int func1(); // declare function taking unspecified parameters 
int func2(void); // declare function taking zero parameters 
... 
// No warning, since parameters are potentially compatible; calling will lead 
// to undefined behavior 
int (*fp1)(double) = func1; 
... 
// warning: assignment from incompatible pointer type 
int (*fp2)(double) = func2; 
-4

您需要顯式聲明該參數,否則你會得到未定義的行爲:)

int func2(double x) 
{ 
    printf("func2(%lf)\n", x); 
    return 0; 
} 
相關問題