fun.c
float fun()
{
return 1.234;
}
test.c
#include <stdio.h>
int main()
{
float a = fun();
printf("%f\n",a);
}
gcc fun.c test.c
[email protected]:~/unix/4$ ./a.out
1067316160.000000
發現得到的結果不僅是個整數 還是個很怪異的數字 并且編譯時沒有報錯 這是為什麼呢?
C語言中的規則是這樣的:
如果上下文中未出現的名字出現在表達式中,并且後面帶一個圓括号,那麼會認為該名字是一個函數,并且假定它的傳回值是int,不會對它的參數做任何假設.
在編譯時加上-Wall 會發現有Warning: implicit declaration of function "fun" 意思是對fun的隐式聲明
傳回值被當作int類型傳回給了float,最後的結果當然怪異啦
造成這個錯誤的原因是沒有聲明函數
在main函數前面加上
float fun();
本意是 extern float fun(); 但函數聲明前面的extern可以省略. 是以可寫可不寫.
寫上聲明不僅可以防止隐式聲明導緻的傳回值類型改變,還可以做函數參數類型檢查,是以注意寫聲明.(或者包含頭檔案)