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違反を引き起こす可能性がある

です。
例によって、コードを書きながら調整していきます。