我通過Visual Studio 2013預處理器運行以下代碼。輸出令我驚訝。C++預處理器中的R和L有什麼特別之處?
HELLO.CPP的內容:
#define A(j) #j
A(A?)
A(B?)
A(C?)
A(D?)
A(E?)
A(F?)
A(G?)
A(H?)
A(I?)
A(J?)
A(K?)
A(L?)
A(M?)
A(N?)
A(O?)
A(P?)
A(Q?)
A(R?)
A(S?)
A(T?)
A(U?)
A(V?)
A(W?)
A(X?)
A(Y?)
A(Z?)
命令:
cl /P hello.cpp
hello.i包含:
#line 1 "hello.cpp"
"A?"
"B?"
"C?"
"D?"
"E?"
"F?"
"G?"
"H?"
"I?"
"J?"
"K?"
"L"
"M?"
"N?"
"O?"
"P?"
"Q?"
"R"
"S?"
"T?"
"U?"
"V?"
"W?"
"X?"
"Y?"
"Z?"
我就遇到了這個試圖調用A(L ?p:q),這導致「Lp:q」對我不好。
這是正確的,明確的C++? C和L中的L和R有什麼特別之處?如果文件具有.c擴展名,則L和R與字母表的其餘部分相同。這與C++ 11有關嗎?它必須是一個新功能,因爲較早版本的MSVS不會以特殊方式使用L和R.
我該如何阻止MSVS 2013以這種特殊方式治療L和R?
'gcc'和'clang'似乎沒有這樣做,'L'和'R'是字符串文字前綴。看起來它正在應用'#'錯誤。 –
不在Visual Studio 2012上重現。 – selbie
您可以在hello.cpp文件中顯示相關代碼嗎? –