2014-01-14 31 views
1

比方說,我有一個宏觀如何將宏值擴展爲寬字符串?

#define CLASS_NAME ItemsList 

後來我想用它的價值,而不是一個符號,而是作爲寬字符串。我的問題開始了。當我簡單的寫(在普通的C++代碼,而不是在宏定義):

L#CLASS_NAME 

編譯器給我一個錯誤,說令牌#此時不預期。當我寫的代理它

#define WSTRING(S) L#S 

,並用它

WSTRING(CLASS_NAME) 

我會得到廣泛的字符串內容「CLASS_NAME」。我想擴展宏,意思是獲取它的價值,而不是轉換宏名稱。

那麼如何正確地做到這一點(Visual Studio 2012)?

回答

2

如果你想L"ItemsList"那麼你可以使用:

#define CONCAT2(X, Y) X##Y 
#define CONCAT(X, Y) CONCAT2(X, Y) 
#define STRINGIFY2(X) #X 
#define STRINGIFY(X) STRINGIFY2(X) 
#define WIDEN(X) CONCAT(L, STRINGIFY(X)) 

,然後寫WIDEN(CLASS_NAME)

+0

您對定義有拼寫錯誤,「WIDEN」應展開爲「WIDEN2」。但更重要的問題是,編寫的「WIDEN(CLASS_NAME)」將擴展到L「CLASS_NAME」,因爲'#'處於第一級擴展。它必須在第二級擴展才能真正擴展參數。 –

+0

另請參閱http://stackoverflow.com/questions/2751870/how-exactly-does-the-double-stringize-trick-work –

+0

@JanHudec你是對的。 – Simple