我蒸餾我的問題到這個代碼片斷 - 但它是一個更大的計劃的一部分,所以我不希望用不同的方式來做到這一點 - 我需要一種方法來使這工作!奇怪的C++預處理器宏語法
當我生成這個代碼預處理後的文件:
#define OUTER(a, b) \
a##b
#define INNER(c, d) \
c##d
enum foo {
OUTER(INNER(x, y), z)
}; // line 108
int APIENTRY _tWinMain(...)
{
foo bar = xyz; // line 112
}
我得到:
enum foo {
xyz
}; // line 108
int __stdcall wWinMain(...)
{
foo bar = xyz; // line 112
}
這就是我想要的。但是,如果我嘗試編譯的代碼我得到:
錯誤C2146:語法錯誤:缺少「}」之前標識符「Z」線108
錯誤C2143:語法錯誤:缺少「;」之前 '}' 線108
錯誤C2143:語法錯誤:缺少 ';'之前 '}' 線108
錯誤C2059:語法錯誤: '}' 線108
錯誤C2065:XYZ':未聲明的標識符線112
我不能工作了!這個問題似乎由該##
造成的:
#define OUTER(a, b) \
a##b
但爲什麼(以及如何解決它)是超越我...
@Jack你能解釋什麼是## b的該怎麼辦?以前從未見過這個。 – InsertNickHere 2010-08-01 17:45:46
@Insert它是一個預處理運算符,它將兩個參數逐字連接起來。例如,OP代碼片段中的'OUTER(test,string)'被預處理器的'teststring'替換。 – 2010-08-01 17:47:21
好吧,我可以證實,這也發生在gcc中,他們的錯誤更具描述性。就是說它不能粘貼''''和'z'。它看起來像預處理器不能這樣做嵌套粘貼,但這是猜測在這一點上。希望有點幫助.. – Blindy 2010-08-01 17:48:31