コンパイラ虐待

boost::spirit(使い方の解説)を使おうとしたのですが、普通にBoostとセットで入れるとコンパイラが古くて通りませんでした*1。そこで、古いコンパイラ向けの対策をしてあるバージョン1.6を使ってビルドすることにしました。が、

…\boost\type_traits\is_array.hpp(64) : fatal error C1076: コンパイラの制限 : ヒープの領域を使い果たしました; 上限を設定するために /Zm オプションを使用してください。
c:\lib\oldspirit\boost\type_traits\is_array.hpp(82) : コンパイルされたクラスのテンプレートのインスタンス化 'boost::detail::is_array_impl(この後1500文字以上続く)の参照を確認してください

コンパイラのメモリを使い果たしてしまいました。仕方ないので、指示通りにメモリを増やして解決しましたが、1500文字以上の識別子は初めて見ました。

なお、上のページをみても分かるかと思いますが、このspiritというライブラリはテンプレートを組み合わせてC++の枠内で構文解析器を作る、というものです。常識的に考えればC++の枠内でやらなくても、yaccやbisonといった便利なツールが世の中にはあふれています。それでもC++で作ってしまうという、なんとも変態的、コンパイラ泣かせのライブラリです。これ以外にもBoostには、無名関数が出来上がるlambda、プリプロセッサに演算をさせるマクロなど変態的(だけど便利)なものもありますが、関数の引数を固定する機能やその他細かいツールもあります。

*1:VC6、フリーのBCC5.5で発生しました