Co jest specjalnego w R i L w preprocesorze C ++?

Uruchomiłem następujący kod za pomocą preprocesora Visual Studio 2013. Wyjście mnie zaskakuje.

Zawartość 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?)

Komenda:

cl /P hello.cpp

hello.i zawiera:

#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?"

Wpadłem na to, próbując wywołać A (L? P: q), co spowodowało „Lp: q”, co nie jest dla mnie dobre.

Czy to właściwe, dobrze zdefiniowane C ++? Co jest specjalnego w L i R w C ++? Jeśli plik ma rozszerzenie .c, L i R są traktowane identycznie jak reszta alfabetu. Czy jest to związane z C ++ 11? Musi to być nowa funkcja, ponieważ starsze wersje MSVS nie traktują L i R w specjalny sposób.

A co mogę zrobić, aby powstrzymać MSVS 2013 przed traktowaniem L i R w ten szczególny sposób?

questionAnswers(2)

yourAnswerToTheQuestion