最近我了解了C中的隐式函数声明。主要思想很清楚,但是在这种情况下,我在理解链接过程时遇到了一些麻烦。
考虑以下代码(文件ac):
#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
我有一个未定义的参考错误。所以一切都很好。
然后我添加另一个文件(文件bc):
double f(double x) {
return x;
}
并调用下一个命令:
gcc a.c b.c -std=c99
令人惊讶的是,一切都已成功链接。当然,在./a.out调用之后,我看到了垃圾输出。
所以,我的问题是:具有隐式声明函数的程序如何链接?在我的示例中,在编译器/链接器的引擎盖下会发生什么?