C語言編譯器不能幫你完成這項檢查
工做中同事分享的一個小問題,特此記錄如下。
- C語言編譯器僅檢查聲明而不檢查定義。
- C語言編譯器只能檢查代碼中引用的其餘函數是否存在聲明,只有在連接時纔會去找到真正的函數定義即連接地址。
- 出現問題:main.c中引用外部.c文件的聲明,但此聲明與.c中的定義參數不一樣,此時編譯器不會報錯,連接正常。但執行代碼就頗有可能出現錯誤了。
//add.c文件內容
int add(int a, int b, int c) //運行到此函數時變量c存儲的是髒數據。
{
return (a+b+c);
}
//main.c文件內容
extern int add(int a, int b); //聲明與定義不一樣
int main(int argc, char** argv)
{
printf("%d\n", add(1, 3));
return 0;
}
>gcc main.c add.c -o test
>./test
>-311033701
- 因此在編寫代碼時必定要注意函數定義與聲明的一致性
- 爲了防止多個文件中定義的函數重名,最好在每一個文件加上文件功能前綴,即模塊名