1. #include guards
#include guards是一种很常用的方法。
VC自动生成的使用MFC的文件会使用宏名类似"AFX_XXX_H__XXX__INCLUDED_"的#include guards。(VS用的是#pragma once)
优点:
●对于多个头文件,可以只包含其中一个(比如,完全相同的两个文件)
●可以针对文件中的一段代码
缺点:
●存在宏名冲突的隐患,造成不可预知的结果(比如,和第三方工具)
2. #pragma once
#pragma once是非标准的,但编译器普遍支持的命令。
优点:
●避免宏名冲突(name clash)
●编译速度快(但有些编译器,如GCC,对#include guards会进行优化处理。这样,#pragma once的这一优点就不是很明显了。)
●较少的代码
缺点:
●依赖于编译器对#pragma once的处理是否正确
●必须针对整个文件
3. 两者结合
缺点:
●无法避免宏名冲突
●无法避免不支持#pragma once的编译报错
于是没什么必要写成这样。