このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

Windows.hのmin/max さらに

min/max対策 - 檜山正幸のキマイラ飼育記 メモ編の続き。

次のような定義があった。

#ifndef min
# define min(x, y) ((x) < (y) ? (x) : (y))
#endif // min

#ifndef max
# define max(x, y) ((x) < (y) ? (y) : (x))
#endif // max

これは:

  1. もともと、Windows.hのmin/maxを前提に書かれたコードであった。
  2. min/maxマクロが弊害があるので、インクルード・ハイアラーキーのどこかでundefされている可能性がある。
  3. このファイルではmin/maxを使うので再定義している。

という事情。ウーン、闇が深い、というか、馬鹿みたい、というか。

次の方針にする。

  1. インクルード・ハイアラーキーの上位で早めにmin/maxはundefする。
  2. undefしたのと同じ場所で、MIN_VAL/MAX_VALをdefする。
  3. 既存のインクルード・ハイアラーキーを使わず自前でWindows.hをインクルードする場合は、そのファイルローカルで処理する。
  4. 既存のインクルード・ハイアラーキーと直にWindows.hをインクルードする方法の併用しようとすると、上の例のようになる。
  5. いずれにしても、min/max は使わずに MIN_VAL/MAX_VALを使うようにすれば事故は少ない。

C/C++で一番やっかいなのは、インクルードハイアラーキーの管理のような気がする。ifdef, undefが絡むと、どの名前がどこから来てるかがホントに分からなくなる。適切なツールもないみたいだし。