linux編程學習筆記(十) C語言中的函數隱式聲明

原地址:http://blog.csdn.net/a8887396/article/details/9017553


fun.c

  1. float fun()  
  2. {  
  3.     return 1.234;  
  4. }  

test.c

  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     float a = fun();  
  6.     printf("%f\n",a);  
  7.       
  8. }  

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可以省略. 所以可寫可不寫.

寫上聲明不僅可以防止隱式聲明導致的返回值類型改變,還可以做函數參數類型檢查,所以注意寫聲明.(或者包含頭文件)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章