这是c编译和链接中的一个简单问题。但我想讨论编译器和链接器的原理。
void f();
int main()
{
f();
}
此代码收到错误消息“未定义引用'f()'”
int main()
{
f();
}
此代码收到错误消息“f未在此范围内声明” 有什么不同? 而且,代码
void f()
{
}
int main()
{
f();
}
运行良好。
答案 0 :(得分:4)
在第一种情况下,您声明一个函数,但不要定义它。它编译正确,但没有链接,因为f
没有定义。因此链接器错误。
在第二种情况下,您尝试调用未声明的符号。编译器不知道f
是什么,因此它会发出错误。这是编译过程中不同阶段的不同问题,因此信息不同。
在第三种情况下,您有一个定义良好的程序(main
无法返回值)。 f
已声明并已定义。该程序应该正确编译,链接和执行。
答案 1 :(得分:0)
澄清这个问题。您应该知道代码如何成为可执行程序。
第一步是“编译”。将源代码编译为* .o文件,该文件是二进制文件。
第二个是“链接”。将* .o文件合并到可执行文件中。
在第一个示例中,您声明了函数f
,但您没有定义它。因此,当链接器链接* .o文件时,它找不到函数f
。
在第二个示例中,您使用函数f
而无需声明或实现。所以编译器报告错误。
在第三个示例中,函数f
实现正在使用它。没错。