プリプロセッサの動作の精神モデルが明らかに不完全で、これが私を狂わせてしまっています。プリプロセッサトークンの展開
2つのトークンを連結したいが、2番目のトークンを最初に展開する必要があります。ここで
#define ANSWER 42
#define FOO foo_ ## ANSWER
、FOO
はfoo_ANSWER
に展開、私はそれがfoo_42
になりたいです。だから私は、これは何とか連結前に引数を拡大することを期待してMERGE
マクロを定義:
#define MERGE(x, y) x ## y
#define BAR MERGE(bar_, ANSWER)
しかしBAR
はまだbar_ANSWER
代わりのbar_42
に展開されます。だから私は、別のマクロHELPER
を定義します。
#define HELPER(x, y) MERGE(x, y)
#define BAZ HELPER(baz_, ANSWER)
そして今BAZ
が正常にbaz_42
に展開されます。現時点では、これは私にとっては魔法のようです。
誰でもこの動作を私に説明できますか?拡張ルールはどのように正確に機能しますか?
この同じ問題について重複して質問していただければ幸いです。私はなぜこの動作が明確に文書化されていないのだろうかと思います。私は、プリプロセッサが動作するアルゴリズムを意味します。 –
@sandundhammika:明確に仕様6.10.3に記載されていますが、いくつかの未定義の動作コーナーがあります。 –