原地址:http://blog.csdn.net/a8887396/article/details/9017553
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
zhao@ubuntu:~/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可以省略. 所以可寫可不寫.
寫上聲明不僅可以防止隱式聲明導致的返回值類型改變,還可以做函數參數類型檢查,所以注意寫聲明.(或者包含頭文件)