C++中主函数如何通过头文件调用其他cpp文件中的子函数,为什么不能直接调用?
在C++中,主函数通过包含(include)相应的头文件来简介调用其他cpp文件中的函数,而不是之间调用,这是由C++的编译和链接模型决定了函数的可见性和访问方式。
为什么不能直接调用?
1.编译模型:在C++中,每个.cpp文件通常被编译成一个单独的目标文件(object file,通常是.o或.obj文件)。这个过程是独立的,编译器不知道其他.cpp文件的存在或内容。
2.链接模型:链接器(linker)负责将所有目标文件组合成一个可执行文件或共享库。在链接阶段,链接器会查找所有定义过的函数和变量,并将它们与相应的引用匹配起来。
3.可见性:在编译时,一个.cpp文件中的函数对另一个.cpp文件是不可见的,除非这些函数在头文件中被声明,并且该头文件被两个.cpp文件都包含。
如何通过头文件间接调用?
1.函数声明:在头文件中声明你想要调用的函数。这个头文件将被多个.cpp文件包含。
2.函数定义:在.cpp文件中定义这个函数。
3.包含头文件:在需要使用这个函数的.cpp文件中包含这个头文件。
4.编译和链接:编译所有的.cpp文件。在链接阶段,链接器会找到所有定义过的函数和变量,并将它们与相应的引用匹配起来。
例如有三个文件:check.h 和 check.cpp,以及一个主文件 main.cpp。
check.h(头文件,包含函数声明):
// check.h
#ifndef CHECK_H
#define CHECK_H
void print(); // 函数声明
#endif // CHECK_H
check.cpp(源文件,包含函数定义):
// check.cpp
#include <iostream>
#include "check.h"
// 函数定义
void print() {
std::cout << "abc" << std::endl;
}
main.cpp(主文件,包含头文件并调用函数):
// main.cpp
#include "check.h" // 包含头文件
int main() {
print(); // 调用print函数
return 0;
}
当编译并链接这些文件时,main.cpp中的print()调用会解析为check.cpp中定义的print()函数,这是因为链接器在链接阶段找到了这个函数的定义,并将其与main,cpp中的引用匹配起来。