这几天在写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文件所调用的外部函数是如何声明的。但在编译成中间文件后,它会吧这些外部引用符号自动纪录到中间文件中。
而所谓的库文件,可以抽象理解成是中间文件的集合。编译器在链接时候只根据当前中间文件所需的函数名来寻找外部中间文件或库中对应的函数实现,并将它们关联在一起。
所以这时候,无论函数长什么样,和链接程序已经没有关系了。