【发布时间】:2020-04-03 13:01:47
【问题描述】:
我需要一种方法来更好地使用 C++ 保护 #include。
当同一个标题被包含两次时,第二个#include应该被忽略(这很简单):
#include "header1.hpp"
#include "header2.hpp"
#include "header1.hpp" //Should be ignored
但是当嵌套命名空间中包含相同的标头时,应该再次包含它(但每个命名空间不超过一次):
#include "header1.hpp"
#include "header2.hpp"
namespace foo_namespace {
//May be this one is needed?
#define NAMESPACE_ID foo_namespace
#include "header1.hpp" //Should be included again
#include "header1.hpp" //Should be ignored
#undef NAMESPACE_ID
};
问题是:我应该如何保护header1.hpp里面的代码?
额外的要求是守卫本身应该是可重用的(定义为宏),因为我有很多应该以这种方式保护的标头。
【问题讨论】:
-
我想知道为什么你需要一个文件被包含两次?
-
我需要所有结构和功能的两个版本。第一个版本使用
double浮点数据类型,第二个版本使用float浮点数据类型。 -
您是否考虑过使用模板来确定数据类型?那么你不必有两次代码。
-
然后我需要为所有东西制作模板。而且,除了数据类型之外,这些头包含的内容可能还有其他细微差别,例如在一个版本中删除了构造函数,在其他版本中缺少一些函数等。
-
我知道我可以将标题中的每个类和每个函数以及每个 typedef 作为依赖于
<bool VERSION>的模板,然后添加 SFINAE 和其他模板魔法来禁用或修改数据类型和函数在VERSION。但我决定改为使用嵌套命名空间,并在#include之前第二次包含标题以及一些额外的typedefs 和#defines。
标签: c++ macros namespaces include preprocessor