我在編譯時得到了以下錯誤。我知道它聽起來不對,但編譯器試圖傳達的確切消息是什麼: 錯誤:'有趣'的衝突類型 錯誤:有趣的是在這裏:使用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);
}
我在編譯時得到了以下錯誤。我知道它聽起來不對,但編譯器試圖傳達的確切消息是什麼: 錯誤:'有趣'的衝突類型 錯誤:有趣的是在這裏:使用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);
}
ķ& R風格聲明是不完全一樣的現代風格的。特別是,默認參數促銷發生,使您的float
參數不完全合法。你有兩個選擇,以解決您的問題:
變化fun
接受double
參數而不是float
。
變化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用於推薦使用clang檢查代碼。 – Aloys
第三種選擇,如果由於某種原因你堅持使用舊式定義,就是在'main'內正確聲明'fun',將'extern int fun(float);'改爲'extern int fun();' 。或者直接刪除'extern'聲明並在'main'之前移動'fun'的定義。 –
怎麼了舊的功能定義? –