头文件本身不会引入新的作用域、命名空间,甚至没有任何类。
使用预处理器 #include
指令包含的头文件基本上是按原样复制粘贴到编译器的后续阶段要解析的翻译单元中。
简而言之,源文件和头文件实际上没有什么区别。两者都可以包含函数或类的声明或定义。
一个非常简化的例子。
假设您有包含单个函数声明的头文件a.h
:
void a_function();
你有一个包含头文件的源文件:
#include "a.h"
int main()
{
a_function();
}
void a_function();
int main()
{
a_function();
}
a_function
函数不属于任何类,它是一个全局函数。
一个头文件(header)是一个文件,而类是由class
或struct
引入的类型。虽然人们常常将每个类放在专门的头文件中进行组织,但它们之间没有具体的关系。例如,<cmath>
只是一些全局(或者更准确地说是命名空间范围内的)和数学相关的函数的集合,并不需要“math”类。
我们可以使用头文件来包含我们的类。我的意思是,其中一个用途是用于包含类,那么其他用途是什么呢?
我们使用头文件来包含各种声明(挑剔一下:定义也可以),不仅仅是类声明。这些可以是类、typedef、函数、变量、命名常量等等。
#include ...
只是一个复制粘贴机制。std::cout << a << std::endl;
Numbers.h
1, 2, 3, 4, 5, 6, 7, 8
以及main.cpp
#include <iostream>
#include <vector>
int main()
{
std::vector<int> bla = {
#include "Numbers.h"
};
for (auto a : bla) {
#include "CodeBody.h"
}
return 0;
}
1
2
3
4
5
6
7
8
现在,我会说像我在CodeBody.h中粘贴代码这样的做法有些可疑,你不应该这样做。但是使用一个包含文件来填充数组或其他数据结构是相当常见的,例如在数字信号处理中,您使用一个专用程序来计算滤波器的系数,将它们保存到文件中,然后通过包含文件将它们导入到您的程序中。
“不是所有的头文件都是类”,这是重点。
头文件只是文件(即代码容器)。这有助于模块化或代码管理:将代码的不同部分放在不同的文件中。
类是一种语言结构。这样的结构可以放在任何你想要的文件中(最糟糕的情况下可以分散在不同的文件中)。
更明确地说,头文件只是纸张,而类是你可以在上面写东西的东西。