“未声明参考”,“未声明”

时间:2015-01-11 03:59:08

标签: c++ compiler-errors linker

这是c编译和链接中的一个简单问题。但我想讨论编译器和链接器的原理。

void f();
int main()
{
    f();
}

此代码收到错误消息“未定义引用'f()'”

int main()
{
    f();
}

此代码收到错误消息“f未在此范围内声明” 有什么不同? 而且,代码

void f()
{

}
int main()
{
    f();
}

运行良好。

2 个答案:

答案 0 :(得分:4)

在第一种情况下,您声明一个函数,但不要定义它。它编译正确,但没有链接,因为f没有定义。因此链接器错误。

在第二种情况下,您尝试调用未声明的符号。编译器不知道f是什么,因此它会发出错误。这是编译过程中不同阶段的不同问题,因此信息不同。

在第三种情况下,您有一个定义良好的程序(main无法返回值)。 f已声明并已定义。该程序应该正确编译,链接和执行。

答案 1 :(得分:0)

澄清这个问题。您应该知道代码如何成为可执行程序。 第一步是“编译”。将源代码编译为* .o文件,该文件是二进制文件。 第二个是“链接”。将* .o文件合并到可执行文件中。 在第一个示例中,您声明了函数f,但您没有定义它。因此,当链接器链接* .o文件时,它找不到函数f。 在第二个示例中,您使用函数f而无需声明或实现。所以编译器报告错误。 在第三个示例中,函数f实现正在使用它。没错。