一、头文件内容:

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,然后再把这两个目标文件进行链接,程序就可以运行了。