我通过Visual Studio 2013预处理器运行了以下代码。输出结果让我感到惊讶。
hello.cpp的内容如下:
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
你好。我包含以下内容:
#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?
gcc
和clang
没有这样做,L
和R
是字符串字面量前缀。看起来它正在错误地应用#
。 - Shafik Yaghmour