多くの C および C++ ファイルで、次のようなマクロを見てきました。
#ifdef X
#undef X // no statements in between
#endif
単純に書くだけで十分だと思います:
#undef X
マクロX
が定義されていない場合、#undef
は効果がありません。
マクロのみを未定義にしたい場合は、standaloneを配置しても問題ありませんか? とにかく、それはコーディングの習慣を悪くしますか?#undef
多くの C および C++ ファイルで、次のようなマクロを見てきました。
#ifdef X
#undef X // no statements in between
#endif
単純に書くだけで十分だと思います:
#undef X
マクロX
が定義されていない場合、#undef
は効果がありません。
マクロのみを未定義にしたい場合は、standaloneを配置しても問題ありませんか? とにかく、それはコーディングの習慣を悪くしますか?#undef
ISO C99 6.10.3.5 パラグラフ 2 を参照してください。
フォームの前処理ディレクティブ
# undef identifier new-line
指定された識別子がマクロ名として定義されなくなります。指定された識別子が現在マクロ名として定義されていない場合は無視されます。
Visual C++ 6 (標準への準拠が悪いことで悪名高い) でさえ、これを可能にします。
#undef
以前に定義されていない識別子にディレクティブを適用することもできます。これにより、識別子が未定義になります。マクロ置換は、#undef
ステートメント内では実行されません。
間違いなく歴史の産物だと思います。jdigital's answerで述べたように、K&R の第 2 版は次のように述べています。
未知の識別子に #undef を適用することは間違いではありません。
しかし、その文は1978年版にはありません。#undef
未定義のマクロ を実行しようとすると、標準化前のコンパイラがエラーをスローすることがよくあります。
また、ANSI C Rationale は次のように述べています。
現在定義されていないマクロを #undef することは明示的に許可されています。
それがすでに普遍的な慣習であるならば、それを論拠として唱える必要はないだろうと私は想像します。
とは言っても、最新のコードでは必要ありませんが、実際に問題になることもありません。
Kernighan と Ritchie (第 2 版) も同意見です。
編集:ソースからの引用(セクションA12.3):
フォームの制御行
# undef
識別子識別子のプリプロセッサ定義が忘れられます。
#undef
未知の識別子に適用することは誤りではありません。