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
これは:
- もともと、Windows.hのmin/maxを前提に書かれたコードであった。
- min/maxマクロが弊害があるので、インクルード・ハイアラーキーのどこかでundefされている可能性がある。
- このファイルではmin/maxを使うので再定義している。
という事情。ウーン、闇が深い、というか、馬鹿みたい、というか。
次の方針にする。
- インクルード・ハイアラーキーの上位で早めにmin/maxはundefする。
- undefしたのと同じ場所で、MIN_VAL/MAX_VALをdefする。
- 既存のインクルード・ハイアラーキーを使わず自前でWindows.hをインクルードする場合は、そのファイルローカルで処理する。
- 既存のインクルード・ハイアラーキーと直にWindows.hをインクルードする方法の併用しようとすると、上の例のようになる。
- いずれにしても、min/max は使わずに MIN_VAL/MAX_VALを使うようにすれば事故は少ない。
C/C++で一番やっかいなのは、インクルードハイアラーキーの管理のような気がする。ifdef, undefが絡むと、どの名前がどこから来てるかがホントに分からなくなる。適切なツールもないみたいだし。