"未定义的引用"与"未声明"

'undefined reference' with 'not declared'

本文关键字:未声明 未定义 引用      更新时间:2023-10-16

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

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

此代码收到错误消息"未定义对'f()'的引用"

int main()
{
    f();
}

此代码收到错误消息"未在此范围内声明 F"有什么区别?更重要的是,代码

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

运行良好。

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

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

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

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