为什么在用C ++调用函数之前需要函数定义?

时间:2020-08-15 18:40:04

标签: c++

大家好,我是C ++语言的新手,我遇到了一个有趣的事实,即在定义函数之前我们不能调用函数。我已经搜索了stackoverflow,但是找不到正确的答案。我在想为什么仅声明不足以调用函数,因为链接器可以从声明中检查参数列表。让我举一个例子来澄清:

我们有一个example.cpp文件,并且我们有函数log(char * message),我们刚刚声明了它(未定义),那么如果我们尝试像log(“ hello world”)那样调用此函数,它将给出错误信息。我知道我们不一定需要在同一文件中定义它(因为链接器可以在链接时链接它)。但是我不明白为什么我们还要定义?

1 个答案:

答案 0 :(得分:5)

简短答案:您不需要可以使用函数定义来编译代码,但是 do 则需要函数定义来链接它(当然要执行!)。

一些澄清,试图使事情简单:

  • 函数的声明是它需要什么,它返回什么
  • 函数的定义是其内容

编译

编译器可以编译正在调用函数(例如std::cout)且仅具有其声明的代码。编译器将只检查您调用此函数的方式与其声明兼容。每次您#include <>并使用标准库中的内容时,都会执行此操作。

链接

在链接阶段(将您的调用链接到实际的已编译函数内容),链接器将使您的代码跳转到该目标函数的已编译定义。因此,此时,您要么需要具有函数的编译版本的目标文件(如果是同一编译目标的一部分),要么是已经包含编译定义的库。

这就是为什么您可以包含包含声明的标头(例如#include <string>),使用其中定义的符号并编译代码的原因。但是在链接时,它将需要您或图书馆提供的定义。否则,您将看到一个链接器错误,通常为Undefined symbol <xxx>,这意味着它找不到定义,并且无法使您的代码跳转到您想要执行的操作。 >