'undefined reference' 和 'not declared'

'undefined reference' with 'not declared'

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

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

此代码收到错误消息"undefined reference to 'f()'"

int main()
{
    f();
}

此代码收到错误消息"f was not declared in this scope" 有什么区别? 更重要的是,代码

void f()
{

}
int main()
{
    f();
}

运行良好。

在第一种情况下,您声明了一个函数,但没有定义它。它可以正确编译,但不能 link,因为没有 f 的定义。因此 linker 错误。

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

在第三种情况下,您有一个定义明确的程序(除了 main 无法 return 一个值)。 f 已声明和定义。程序应该编译,link,并正确执行。

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