1、概述
- 头文件通过 include 预处理器指示符(preprocessor include directive)而成为我们程序的一部分
- 预处理器指示符用 # 号标识,这个符号将放在程序中该行的最起始一列上处理,这些指示符的程序被称做预处理器 preprocessor,通常捆绑在编译器中
2、分类
- #include:
- 头文件通过 include 预处理器指示符(preprocessor include directive)而成为我们程序的一部分
- #ifndef
- 条件指示符
- 被包含的文件还可以含有#include 指示符,由于嵌套包含文件的原因,一个头文件可能会被多次包含在一个源文件中,条件指示符可防止这种头文件的重复处理
- 为了保证头文件只被处理一次,把#define 指示符 #define BOOKSTORE_H,放在#ifndef后面,这样在头文件的内容第一次被处理时,BOOKSTORE_H将被定义,从而防止了在程序文本文件中以后#ifndef指符的值为真 。
- #ifdef
- 常被用来判断一个预处理器常量是否已被定义,以便有条件地包含程序代码
3、细节点
- 头文件类型
- 如果文件名用尖括号 < 和 > 括起来,表明这个文件是一个工程或标准头文件,查找过程会检查预定义的目录 ○ 如果文件名用一对引号括起来,则表明该文件是用户提供的头文件,查找该文件时将从当前文件目录开始
- #include <some_file.h>
- #include "my_file.h"
- 预处理器常量
- 我们在编译程序时可以使用-D选项,并且在后面写上预处理器常量的名字,这样就能在 命令行中定义预处理器常量
- C/C++预处理器
- 编译 C++程序时 编译器自动定义了一个预处理器名字__cplusplus,注意前面有两个下划线,,因此,我们可以根据它来判断该程序是否是 C++程序,以便有条件地包含一些代码
- 在编译标准 C 时,编译器将自动定义名字__STDC__
- 当然,__cplusplus 与__STDC__ 不会同时被定义
- C/C++库在C++环境下的头文件命名
- assert.h是 C 库头文件的 C 名字
- C++程序可以通过 C 库的 C 名字或 C++名字来使用它
- 这个头文件的 C++名字是 cassert
- C 库头文件的 C++名字总是以字母 C 开头,后面是去掉后缀.h 的 C 名字
- 由于在各种 C++实现中,头文件的后缀各不相同,因此标准 C++头文件没有指定后缀
- C/C++库在C++环境下的使用效果
- 使用头文件的 C 名字,或者 C++名字,两种情况下头文件的#include 预处理器指示符的 效 ○ #include <cassert>,将 cassert 的内容被读入到我们的文本文件中
- 由于所有的 C++库名字是在名字空间 std 中被定义的,因而在我们的程序文本文件中,它们是不可见的
- 除非用 using namespace std 指示符显式地使其可见
- #include <assert.h>,使用 C 头文件的C名字,可以直接在程序文本文件中使用名字assert(),而无需使用 using 指示符
- 命名空间
- 库文件厂商用命名空间来控制全局名字空间污染,即名字冲突问题,以避免它们的库污染 了用户程序的名字空间