我们都知道什么时候应该使用include保护,但是什么时候不应该在我们的项目中使用它呢?
最近,我看到一个混合编译(CUDA + GCC)的项目,一个头文件(CUDA文件)故意没有包含保护。我只是好奇。
我想到了两种情况:
- 当你想打开/关闭调试功能(如
assert.h
的工作方式) - 用于'x-macro'类型的功能,其中包含文件执行问题的两个部分,例如定义一个枚举,然后定义一个与枚举对应的字符串化名称数组
在我们的项目中,我们从不使用include保护。我们正在使用include antiguard:
#ifndef _stdafx_h_
#define _stdafx_h_
#else
#error reinclude stdafx.h
#endif
因为如果你重新包含相同的头-你写了错误的代码或使用错误的架构。
当您想要使用不同的参数多次包含相同的文件时的一个例子。在这种情况下,包含文件将充当一种模板。一个例子是Dosbox上的标量
使用Include保护,使包含文件可以在单个编译单元中被包含多次,而不会导致重复声明。
当文件应该在一个编译单元中包含多次时,不要使用include保护符,这样不会导致重复的声明。