這幾天在寫Linux的靜態庫的時候遇到一個問題,就是為什麼組成靜態庫的源文件之間的函數可以相互調用,而且不用通過任何頭文件的輔助和聲明?
具體情況如下,我寫了一個簡單的案例
TestLib1.c:
#include
#include
void A()
{
printf("this is function a\n");
B();//這個函數文件在TestLib2.c中
}
TestLib2.c:
#include
#include
void B()
{
printf("This is function B\n");
}
TestLib1.c和TestLib2.c共同形成libtest.給主函數文件Test.c使用
Test.c:
#include
#include
int main()
{
printf("This is Test main\n");
A();
}
可以運行成功,請問這是為什麼在LibTest1.c中調用LibTest2.c的B函數可以不用頭文件輔助或是extern聲明?請大神講解一下
因為C編譯器編譯分編譯和鏈接兩部分,在編譯的時候,需要通過extern的定義獲知當前c文件所調用的外部函數是如何聲明的。但在編譯成中間文件後,它會吧這些外部引用符號自動紀錄到中間文件中。
而所謂的庫文件,可以抽象理解成是中間文件的集合。編譯器在鏈接時候只根據當前中間文件所需的函數名來尋找外部中間文件或庫中對應的函數實現,並將它們關聯在一起。
所以這時候,無論函數長什麼樣,和鏈接程序已經沒有關系了。