天天看點

linux程式設計學習筆記(十) C語言中的函數隐式聲明

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

寫上聲明不僅可以防止隐式聲明導緻的傳回值類型改變,還可以做函數參數類型檢查,是以注意寫聲明.(或者包含頭檔案)