これらのコードブロックが異なる結果をもたらすのはなぜですか?
いくつかの一般的なコード:
#define PART1PART2 works
#define STRINGAFY0(s) #s
#define STRINGAFY1(s) STRINGAFY0(s)
ケース1:
#define GLUE(a,b,c) a##b##c
STRINGAFY1(GLUE(PART1,PART2,*))
//yields
"PART1PART2*"
ケース2:
#define GLUE(a,b) a##b##*
STRINGAFY1(GLUE(PART1,PART2))
//yields
"works*"
ケース3:
#define GLUE(a,b) a##b
STRINGAFY1(GLUE(PART1,PART2*))
//yields
"PART1PART2*"
VS.net2005sp1のMSVC++を使用しています
編集:現在、マクロを展開するときにプリプロセッサが次のように機能すると信じています。ステップ1:-本文を取得します-##演算子の周りの空白を削除します-文字列を解析します。パラメーター:-##演算子の隣にある場合は、識別子をパラメーターのリテラル値(つまり、渡された文字列)に置き換えます。-##演算子の隣にない場合は、この説明プロセス全体を最初にパラメータの値を入力してから、識別子をその結果に置き換えます。(stringafyシングル'#'ケースatmを無視します)-すべての##演算子を削除します
ステップ2:-結果の文字列を取得し、マクロを解析します
さて、それから私は3つのケースすべてがまったく同じ結果の文字列を生成するはずだと信じています:
PART1PART2 *
したがって、ステップ2の後、結果は次のようになります。
動作します*
しかし、少なくとも同じ結果になるはずです。