考虑一个文件functions.cpp:
// functions.cpp
void f1(){/* do something */}
void f2()
{
f1();
}
Run Code Online (Sandbox Code Playgroud)
我希望f2在不同的 cpp 文件中使用该函数,因此我创建了一个头文件functions.h:
// functions.h
#ifndef F2
#define F2
void f2();
#endif
Run Code Online (Sandbox Code Playgroud)
现在,该main.cpp文件是我调用的地方f2:
// main.cpp
#include "functions.h"
int main()
{
f2();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译这个工作正常,但我没有f1在functions.h. 那么什么时候f2被调用,编译器怎么知道f1呢?
当main.cpp被转换,外部基准被生成以该函数f2。粗略地说,这意味着编译器生成的目标文件包含在某个地址调用函数的指令,并留下元数据告诉链接器填写f2. 另外,编译器翻译functions.cpp并在内部解析来自f2to的引用,f1并发出一个包含f2. 然后,链接器看到包含 的目标文件f2和需要 的地址的目标文件f2,将它们“链接”到一个可执行文件中。因此, 的调用者f2不需要知道 使用的任何实体的声明f2。