一、头文件内容:
1.头文件内容中应该只放变量和函数声明,而不能放它们的定义。因为一个头文件实际上会被引入到多个不同的.cpp文件中,并且它们都会被编译。如果放了定义,那么也会在多个文件中出现一个对于一个变量或函数的定义,纵然这些定义相同,但是对于编译器来说,这样做是不合法的。比如头文件可以写:extern int a;和void f()的声明,但不能放int a;和void f(){}的定义。
2.头文件可以写const对象和static对象的定义。因为全局的const和static对象默认是没有extern的声明的,所以只在当前文件中有效,而且这些.cpp问价的该对象都是从一个头文件中 包含进去的。
二、头文件(.h)与源文件(.cpp)链接原理:
在用visual studio 2022学数据结构时,我发现头文件的内容(.h文件)和源文件内容(.cpp文件)是内容是一样的,都是C++的源代码。但是头文件不用被编译,我们把所有的函数声明全部放在一个头文件中,当某一个.cpp源文件需要它们时,它们就可以通过"#include"包含进这个.cpp文件中,从而把他们的内容合并到.cpp文件中,当.cpp文件被编译的时候,这些被包含的.h文件的作用便发挥了。
举个例子,假设所有函数只有两个,f1和f2,那么我们把它们的定义放在math.cpp里:
/* math.cpp */
double f1()
{
//do something here....
return;
}
double f2(double a)
{
//do something here...
return a * a;
}
/* end of math.cpp */
并把“这些”函数的声明放在一个头文件math.h中:
/* **math.h** */
double f1();
double f2(double);
/* end of math.h */
在另一个文件main.cpp中,我要调用这两个函数,那么就只需要把头文件包含进来:
/* main.cpp */
#include "math.h"//include的作用是把它后面所写的那个文件的内容,完完整整地、一字不改地包含到当前文件中来。
main()
{
int number1 = f1();
int number2 = f2(number1);
}
/* end of main.cpp */
这 样,便是一个完整的程序了。需要注意的是,.h文件要在编译器找得到的地方(比如跟main.cpp在一个目录下)。 main.cpp和math.cpp都可以分别通过编译,生成main.o和math.o,然后再把这两个目标文件进行链接,程序就可以运行了。