3

次のように、マクロの 1 つがコメント ブロックを開始し、別のマクロがそれを終了するように、マクロのグループ内に複数行のコメントを含める必要があります。

#define C_BEGIN /*
#define C_END */
... other macros

しかし、案の定、このアプローチは機能しません。

4

4 に答える 4

8

次の理由でそれを行うことはできません。それが可能であると仮定しましょう。

それで、自分自身を に置き換えるマクロを作成し、/*別のマクロを に置き換えました*/。その後どうなりますか?まず、コメントがコードから削除されます。その後、プリプロセッサはマクロをコメントに置き換えます。その後、コンパイラは窒息します: 何をすべきかわからず/**/単にそのようなことに直面することがないためです: コメントはコンパイル前に常に削除されるため、「コメント」が何であるかさえわかりません。おそらく、除算とそれに続く乗算であると考えるでしょう。

したがって、私たちの仮定は間違っており、あなたはそれを行うことができません.

于 2012-07-30T13:10:07.363 に答える
4

コメント処理は、マクロ展開の前に行われます。

2.2翻訳のフェーズ[lex.phases]

1-翻訳の構文規則の優先順位は、次のフェーズで指定されます。[...]
  3.[...]各コメントは1つのスペース文字に置き換えられます。[...]
  4.前処理ディレクティブが実行され、マクロ呼び出しが拡張されます[...]

おそらく、ソースファイルを2回前処理してみることができますか?(注:これは行わないでください。)

于 2012-07-30T13:21:21.500 に答える
2

しかし、確かに、このアプローチは機能しません。

動作しません。あなたのコメントは#define C_BEGINあなたのマクロ定義の一部ではなく、あなたのマクロ定義の一部にすることはできません。言語に関する限り、あなた#define C_ENDはマクロ定義ではありません。それはその複数行のコメントのほんの一部です。言い換えれば、それは空白です。プリプロセッサ/コンパイラがマクロ定義を解釈する段階に入る前に、コメントが処理されます(空白に変換されます)。

于 2012-07-30T13:06:24.513 に答える