标准格式:在头文件中写:
#ifndef -XXX-
#define -XXX-
.......
#endif
通过阅读 GeekBand c++学习笔记——防卫式声明的背后,发现编译器对头文件进行了以下预处理:
- 编译器将处理掉所有注释,以空格代替;
- 删除#define,展开所有宏定义;
- 处理条件编译指令#if、#ifdef、#elif、#else、#endif;
- 处理#include,展开被包含的头文件(直接将头文件复制进文件)
- 保留编译器需要使用的#progma指令等等。
编译器还会做很多其他事情,但是从第四条可以看出,会将头文件中写的代码直接复制进文件。那么可以想象,如果有多份头文件均不进行防卫式声明,均包含了类似<iostream>这种内容很多的头文件,经过预处理以后的文件,即便自己只写了一行代码cout,它包含的代码量将是何其的庞大。这还不是最关键的问题,关键是头文件中定义了一个变量,那么多次包含该头文件之后,就会产生重复定义的问题,那么防卫式声明其实防止重复声明与定义。