包括宏定义的头文件

时间:2010-08-10 22:48:21

标签: c++ c macros include c-preprocessor

我需要提供配置文件,它将描述要包含哪些STL头文件。我发现通常是通过定义很多HAVE_XXX_HEADER宏来完成的。我想知道在宏中明确提供标题名称是否有问题。然后,而不是测试每个变体:

#if defined(HAVE_TR1_UNORDERED_MAP_HEADER)
#include <tr1/unordered_map>
#elseif (...)
#endif
你可以简单地说:

#define UNORDERED_MAP_HEADER <tr1/unordered_map>
(...)
#include UNORDERED_MAP_HEADER

另外带来了灵活性,因为标题名称在配置文件中没有硬编码。

3 个答案:

答案 0 :(得分:4)

当然,你可以做到。你也可以使用函数宏;例如,我在我的项目中使用它,因为gcc将TR1标题放在子目录中:

#ifdef __GNUC__
#  define TR1_HEADER(header) <tr1/header>
#else
#  define TR1_HEADER(header) <header>
#endif

#include TR1_HEADER(unordered_map)
#include TR1_HEADER(memory)
#include TR1_HEADER(functional)
// etc.

#undef TR1_HEADER

我已经在gcc和MSVC 2008上对此进行了测试。其他编译器可能需要其他黑客攻击,尽管在这种特殊情况下gcc在MSVC时并不严格兼容,因此它应该开箱即用。

答案 1 :(得分:2)

这在C99中是可行且合法的,参见ISO 9899:1999§6.10.2示例2.类似的例子也可以在(draft) C++ standard,16.2子弹8中找到。

答案 2 :(得分:0)

我尝试过:

#define BBB <stdlib.h>
#include BBB

使用MSVS 2005编译好。问题是什么?