47

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 を処理しないようにするにはどうすればよいでしょうか?

4

2 に答える 2

3

これは、MSVC プリプロセッサのバグのようです。良いニュースは、出力の好みによっては、R または L の後にスペースを入れることで問題を回避できることです。

A(L ?p:q), // "L ?p:q"
于 2014-01-13T19:56:53.737 に答える