2010-08-10 120 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標準,所以它應該開箱即用。