2013-10-23 83 views
1

我剛開始嘗試學習C並有一個非常基本的問題。下面列出的代碼從mult函數中輸出一個錯誤,指出存在'mult的衝突類型'奇怪/簡單的C錯誤

我看不出有什麼衝突的類型。但是,如果我要將這些值的數據類型替換爲整數,我不會有任何問題。我假設我錯過了一些非常簡單的事情。任何幫助?

#include <stdio.h> 

int main() 
{ 
    double number1; 
    double answer; 

    answer = mult(number1); 

    getchar(); 
    return 0; 
} 

double mult(double x, double y) 
{ 
    return x * y; 
} 
+0

那麼,你如何解釋這個顯而易見的問題:你的'mult'函數需要**兩個**參數,而你只傳遞**一個**?既然你是編寫代碼的人,這個問題應該立即引起你的注意,不是嗎?通過只用一個參數調用雙參數函數,你試圖達到什麼目的? – AnT

回答

3

您還沒有宣佈mult然後再使用它,所以編譯器隱式聲明它爲您的int mult()。然後編譯器找到你的定義並且它不匹配。

嘗試的main()前添加一個原型:

double mult(double, double); 

或者main()之前只是定義它。

+5

他也只用一個參數來調用函數。 –

+0

@YuHao:是的,他會在接下來的錯誤。 –

+0

重複我對另一個答案的評論:從C99開始,沒有隱式函數聲明;調用沒有可見聲明的函數是違反約束的。 (許多編譯器只是警告它並回到C90規則。) –

2

有幾個問題,一個你要使用mult聲明之前,在一個解決將是向前聲明multmain之前,像這樣:

double mult(double x, double y) ; 

或只是定義multmain之前,否則çC99將隱含地定義mult這樣int mult()C99基思指出,這是一個約束衝突。最近的clang版本會警告你:

的功能「MULT」隱含的聲明是在C99無效

gcc只會提醒你,它被隱式聲明的,這就是爲什麼你收到類型衝突。您還試圖調用mult在這裏只有一個參數:

answer = mult(number1); 

但它定義爲採用兩個參數。最後,您正在使用number1而無需初始化它,這意味着它將具有不確定的值。

+0

從C99開始,就沒有隱式函數聲明;調用沒有可見聲明的函數是違反約束的。 (許多編譯器只是警告它,並回到C90的規則。) –

+0

@KeithThompson是的,我真的知道這一點,我應該提到它,我實際上使用'鐺',所以它徹底告訴我。 –

+0

這是您學習現代C編程時不應該使用舊的垃圾編譯器的很多原因之一。 – Lundin