Hamigaki.Detail
MinGWの件は置いといて、ライブラリの構造のお話です。
HamigakiライブラリではBoostの構造を真似て、ライブラリ毎に名前空間とディレクトリを分割しています。(Hamigaki.Iteratorなど一部例外あり)
いろいろなライブラリを作っていると、処理系依存のコードであっても、ライブラリ間で共有したいものやライブラリユーザーに対しても公開したいものが出てきます。
その一方で、標準外のヘッダの中には次のような問題を持ったものが多くあり、ヘッダからインクルードしたくないのです。
・標準関数と同名のマクロ
min/maxなど。
関数を呼ぶつもりがマクロが展開されてコンパイルエラーになる場合があります。
参照: Boostのガイドライン
http://www.boost.org/more/lib_guide.htm#Guidelines
・ヘッダの挙動を変えるマクロ
POSIX_C_SOURCEやFD_SIZEなど。
ヘッダをインクルードする順番で挙動や構造体のサイズが変わったりして大変です。
要するに、コードをまとめたいけれど、標準外のヘッダを見せたくないのです。
これらの両方の要求を満たすため、少し前からHamigaki.Detailライブラリを用意しています。
このライブラリは公開するヘッダからはインクルードしない(ソースファイルからインクルードする)ことが前提の、処理系依存ユーティリティの集合です。
現状の問題点は、
- Hamigaki.Detail内部でのインクルードでmin/maxの問題に引っ掛かる(今は、その都度undefしている)
- ODR違反を引き起こす可能性がある
です。
例によって、コードを書きながら調整していきます。