最近我学习了有关C语言中隐式函数声明的知识。主要思想很清楚,但我对这种情况下的链接过程有些困惑。
请考虑以下代码(文件a.c):
#include <stdio.h>
int main() {
double someValue = f();
printf("%f\n", someValue);
return 0;
}
如果我尝试编译它:
gcc -c a.c -std=c99
我看到了一个有关函数 f()
隐式声明的警告。
如果我尝试编译和链接:
gcc a.c -std=c99
我遇到了一个未定义引用错误。但是一切都很好。
然后我添加了另一个文件(文件b.c):
double f(double x) {
return x;
}
接下来执行以下命令:
gcc a.c b.c -std=c99
令人惊讶的是,一切都成功地链接了起来。当然,在调用./a.out后,我看到了一些垃圾输出。
那么,我的问题是:如何链接具有隐式声明函数的程序?在编译器/链接器的内部发生了什么?