2013-06-19 45 views
1

我在編譯時得到了以下錯誤。我知道它聽起來不對,但編譯器試圖傳達的確切消息是什麼: 錯誤:'有趣'的衝突類型 錯誤:有趣的是在這裏:使用K&R樣式函數定義的錯誤

int main() 
{ 
    extern int fun(float); 
    int a; 
    a=fun(3.14F); 
    printf("%d\n",a); 
    return 0; 
} 

int fun(aa) 
float aa; 
{ 
    return((int) aa); 
} 
+2

怎麼了舊的功能定義? –

回答

2

ķ& R風格聲明是不完全一樣的現代風格的。特別是,默認參數促銷發生,使您的float參數不完全合法。你有兩個選擇,以解決您的問題:

  1. 變化fun接受double參數而不是float

  2. 變化fun定義爲標準C風格的函數定義:

    int fun(float aa) 
    { 
        return aa; 
    } 
    

    我也去掉了不必要的投&括號。

順便說一句,如果你是一個初學者,你可能會發現clang有益的 - 它有時會提供更好的錯誤消息。例如:

example.c:13:7: warning: promoted type 'double' of K&R function parameter is not 
     compatible with the parameter type 'float' declared in a previous 
     prototype [-Wknr-promoted-parameter] 
float aa; 
    ^
example.c:5:25: note: previous declaration is here 
    extern int fun(float); 
         ^
+1

+1用於推薦使用clang檢查代碼。 – Aloys

+0

第三種選擇,如果由於某種原因你堅持使用舊式定義,就是在'main'內正確聲明'fun',將'extern int fun(float);'改爲'extern int fun();' 。或者直接刪除'extern'聲明並在'main'之前移動'fun'的定義。 –