36

多くの C および C++ ファイルで、次のようなマクロを見てきました。

#ifdef X
#undef X  // no statements in between
#endif

単純に書くだけで十分だと思います:

#undef X

マクロXが定義されていない場合、#undefは効果がありません。

マクロのみを未定義にしたい場合は、standalone配置しても問題ありませんか? とにかく、それはコーディングの習慣を悪くしますか?#undef

4

3 に答える 3

25

ISO C99 6.10.3.5 パラグラフ 2 を参照してください。

フォームの前処理ディレクティブ

# undef identifier new-line

指定された識別子がマクロ名として定義されなくなります。指定された識別子が現在マクロ名として定義されていない場合は無視されます。

Visual C++ 6 (標準への準拠が悪いことで悪名高い) でさえ、これを可能にします。

#undef以前に定義されていない識別子にディレクティブを適用することもできます。これにより、識別子が未定義になります。マクロ置換は、#undefステートメント内では実行されません。

于 2012-02-01T04:08:35.743 に答える
11

間違いなく歴史の産物だと思います。jdigital's answerで述べたように、K&R の第 2 版は次のように述べています。

未知の識別子に #undef を適用することは間違いではありません。

しかし、その文は1978年版にはありません。#undef未定義のマクロ を実行しようとすると、標準化前のコンパイラがエラーをスローすることがよくあります。

また、ANSI C Rationale は次のように述べています

現在定義されていないマクロを #undef することは明示的に許可されています。

それがすでに普遍的な慣習であるならば、それを論拠として唱える必要はないだろうと私は想像します。

とは言っても、最新のコードでは必要ありませんが、実際に問題になることもありません。

于 2012-02-01T05:10:38.353 に答える
9

Kernighan と Ritchie (第 2 版) も同意見です。

編集:ソースからの引用(セクションA12.3):

フォームの制御行

# undef 識別子

識別子のプリプロセッサ定義が忘れられます。#undef未知の識別子に適用することは誤りではありません。

于 2012-02-01T04:03:31.807 に答える