2010-08-10 110 views
0

我需要提供配置文件,它将描述要包含哪些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 

它除了带来了灵活性,因为头名字很容易配置文件中编码。

回答

2

这是可能的和法律的C99,比照ISO 9899:1999§6.10.2例2类似的例子还可以在(draft) C++ standard发现,16.2子弹8

0

我试图做:

#define BBB <stdlib.h> 
#include BBB 

它编译罚款,使用MSVS 2005年有什么问题?

+3

问题是,显示它适用于特定的编译器并不意味着它适用于每个符合标准的编译器。 – GManNickG 2010-08-10 22:56:29

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标准,所以它应该开箱即用。