C語言編譯器不能幫你完成這項檢查

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
  • 因此在編寫代碼時必定要注意函數定義與聲明的一致性
  • 爲了防止多個文件中定義的函數重名,最好在每一個文件加上文件功能前綴,即模塊名
相關文章
相關標籤/搜索