1 . 虽然我学过一段时间的C#,但当我第一次转入到C++的时候,说实话,开始就被头文件给整懵逼了,不过由于C#是在C/C++的基础上衍生的,除了个头文件和一些没见过的点外,后续学起来会相对轻松点。
2 . 所以我接下来要说的是头文件和命名空间……

头文件

1 . 头文件(Header Files)是C或C++等编程语言中,用于声明函数、变量、宏和类型定义的文件,它们通常以.h或.hpp等扩展名结尾。头文件使得程序员能够在多个源文件中使用相同的函数和类型定义,而不必重复编写代码。
2 . C/C++提供了一套标准库,使用的时候需要用预处理指令#include将其引入,这就被称作头文件,当然,开发者也可以自定义一个函数库,同样使用预处理指令#include将其引入,它的功能和Python的模块导入代码import很相似。
3 . 说的直白点,为了高效,头文件可以将已经写好的外部函数库或者标准库引入,这样可以大幅度减少代码的重复编写,提高开发效率和代码的可维护性。头文件的使用允许开发者在程序的不同部分重用已经定义好的代码,例如函数、类、模板等。这种重用机制不仅减少了代码冗余,也使得代码更加模块化,易于管理和扩展。

4 . 头文件的组织结构通常遵循一定的命名规范,以便于开发者快速识别和查找所需的头文件。例如,标准库的头文件通常以<>括起来,而项目中的自定义头文件则使用""括起来

5 . 在C++中,头文件还与命名空间(Namespace)紧密相关。命名空间用于组织代码,避免不同库之间的名称冲突。头文件中通常会包含相应的命名空间声明,以确保使用其中的实体时不会产生命名冲突。

6 . 看下面的经典代码,如果我们想输出“Hello World”,那么我们就需要调用控制台来输出,而count << << endl方法提供了这样一个功能,但它属于C++一个标准库,所以需要使用#include <iostream>来引入这个库,最后还需要将该标准库下的命名空间引入,这样编译器才能识别这个输出代码。

1
2
3
4
5
6
7
8
9
#include <iostream>

using namespace std;

int main()
{
cout << "Hello World" << endl;
return 0;
}

7 . 当然,如果不想引用命名空间,可以以命名空间::方法名在代码中直接调用(除被结构体封装外)例如:

1
2
3
4
5
6
7
#include <iostream>

int main()
{
std::cout << "Hello World" << std::endl;
return 0;
}

命名空间

1 . 命名空间在C#已经学到过了,所以很好理解。如果是以C#的方式去理解的话,那它单纯就是将函数库引入到项目代码中。而如果是C/C++,那么就有区别了:
2 . C/C++是使用头文件的预处理指令#include将函数库引入到项目中,但有些它里函数库里可能也包含了命名空间,当存引入多个函数库时,可能会存在重名的函数,那么就需要使用命名空间将其归类,以免重名冲突。
3 . 这里就不演示了,上面头文件的演示可以再参考一下。

自定义头文件

要想最深入的了解到头文件,可以实践操作一下,自定义一个头文件。

1 . 头文件是允许开发者根据自己的需求自定义的。
2 . 它通常是一个后缀为.h的文件。
3 . 下面我们来创建一个头文件,在里面写一个加法运算的全局函数,我们将其命名为:Basen

1
2
3
4
5
6
7
8
namespace Basen
{
void add(int a, int b)
{
int addafter = a + b;
printf("计算结果为:%d", addafter);
}
}

4 . 接下来,我们将这个自定义的头文件使用预处理指令将其引入到项目中:#include "test.h"
5 . 最后将命名空间引入:using namespace Basen;
6 . 这样我们就可以直接使用自定义的头文件了。

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include "test.h"

using namespace std;
using namespace Basen;

int main()
{
int a = 10;
int b = 7;
add(a, b);
}

补充

这里对上稍微做出一些补充

1 . 首先,头文件的,它相当于直接将代码复制到项目中了。
2 . 头文件并没有被直接运行,而是被#include包含(复制)到源文件中,处于预处理阶段。