2011-01-20 88 views
18

我試圖在宏中生成包含文件名。這應該是在C++中的法律:在宏中生成包含文件名

#define INCLUDE_FILE "module_impl_win.hpp" 
#include INCLUDE_FILE 

這工作正常,但只要我嘗試生成的文件名是failes編譯

#define INCLUDE_FILE(M) M##"_impl_win.hpp" 
#include INCLUDE_FILE("module") 

其實它給我的警告上MSVC2010

警告C4067:意外的標記以下預處理器指令 - 預計一紐林

但它不包含該文件。

什麼問題?我怎樣才能擺脫它?

回答

18

我會這樣做使用助手引用宏。像這樣的東西會給你想要的東西:

#define QUOTEME(M)  #M 
#define INCLUDE_FILE(M) QUOTEME(M##_impl_win.hpp) 

#include INCLUDE_FILE(module) 
3

的問題是,最終你的代碼應該是這樣的:

#include "module""_impl_win.hpp" 

這會產生同樣的警告和錯誤您所看到,但在一個稍微更明顯的方式。

雖然編譯器會接受該語法,但預處理器不會。

我沒有建議讓你正在嘗試做的工作。個人不希望使用這種類型的宏,因爲它使得更難以直觀地瀏覽代碼,並且可能會阻止很多編輯快速瀏覽代碼。

+0

謝謝,不知道它連接這樣的字符串。想象一下,有數百個文件包含#ifdef ... #endif平臺特定的頭文件。如果明天我會添加對另一個平臺的支持,那麼我需要編輯所有這些文件,而不是隻編輯一個宏並添加平臺特定的實現文件。這很傷心。 – ledokol 2011-01-20 06:29:45

+0

@ledokol:爲什麼特定於平臺的功能不能被拆分爲單獨的頭文件和源文件,這些文件不包含在其他地方?應該很容易將平臺特定的和依賴於平臺的功能整合到相對較小的一組文件中。 – 2011-01-20 06:43:30

3

您還可以使用升壓預處理器,尤其是BOOST_PP_STRINGIZE/BOOST_PP_CAT宏:

#include <boost/preprocessor/cat.hpp> 
#include <boost/preprocessor/stringize.hpp> 

#define INCLUDE_FILE(M) BOOST_PP_STRINGIZE(BOOST_PP_CAT(M, _impl_win.hpp)) 

// expands to: #include "module_impl_win.hpp" 
#include INCLUDE_FILE(module) 

(參見C Macro - DynamiC#include

注意,這患有與@ Andrew的答案相同的問題(導致下劃線=保留的標識符)。

相關問題