次のように、マクロの 1 つがコメント ブロックを開始し、別のマクロがそれを終了するように、マクロのグループ内に複数行のコメントを含める必要があります。
#define C_BEGIN /*
#define C_END */
... other macros
しかし、案の定、このアプローチは機能しません。
次の理由でそれを行うことはできません。それが可能であると仮定しましょう。
それで、自分自身を に置き換えるマクロを作成し、/*
別のマクロを に置き換えました*/
。その後どうなりますか?まず、コメントがコードから削除されます。その後、プリプロセッサはマクロをコメントに置き換えます。その後、コンパイラは窒息します: 何をすべきかわからず/*
、*/
単にそのようなことに直面することがないためです: コメントはコンパイル前に常に削除されるため、「コメント」が何であるかさえわかりません。おそらく、除算とそれに続く乗算であると考えるでしょう。
したがって、私たちの仮定は間違っており、あなたはそれを行うことができません.
コメント処理は、マクロ展開の前に行われます。
2.2翻訳のフェーズ[lex.phases]
1-翻訳の構文規則の優先順位は、次のフェーズで指定されます。[...]
3.[...]各コメントは1つのスペース文字に置き換えられます。[...]
4.前処理ディレクティブが実行され、マクロ呼び出しが拡張されます[...]
おそらく、ソースファイルを2回前処理してみることができますか?(注:これは行わないでください。)
しかし、確かに、このアプローチは機能しません。
動作しません。あなたのコメントは#define C_BEGIN
あなたのマクロ定義の一部ではなく、あなたのマクロ定義の一部にすることはできません。言語に関する限り、あなた#define C_END
はマクロ定義ではありません。それはその複数行のコメントのほんの一部です。言い換えれば、それは空白です。プリプロセッサ/コンパイラがマクロ定義を解釈する段階に入る前に、コメントが処理されます(空白に変換されます)。