我通过 Visual Studio 2013 预处理器运行了以下代码。输出让我吃惊。
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 和 R 有什么特别之处?如果文件具有 .c 扩展名,则 L 和 R 被视为与字母表的其余部分相同。这与 C++11 有关吗?它一定是一个新特性,因为旧版本的 MSVS 不会以特殊方式处理 L 和 R。
我能做些什么来阻止 MSVS 2013 以这种特殊方式处理 L 和 R?