C or C++

今日ではC++はCの完全なスーパーセットではない。また、規格とは別に処理系独自の拡張を考慮すると現実は混沌としている。本当にポータブルなコードを書くのはなかなかやっかいな話だ。
あるCで書かれたオープンソースなソフトウェアをコンパイルしようとしたのだが、グローバル変数の初期化子が定数式ではないとしてエラーとなった。そのソフトウェアの製作者はおそらく定数式でなくても受け付けるようなコンパイラを使っていたのだろう。まっとうな解決策としてはグローバル変数初期化用のルーチンを別途設けるというのがあるが、それはちょっと面倒だ。
そこで、C++としてコンパイルしてみた。定数式関連についてはパスしたのだが、今度は別の箇所で不正な型変換エラーを補足した。C++の方が型チェックに厳しいのは知っていたが、なにもエラーにしなくてもと思ったりもする。適切なキャストを入れたり型変換コードの追加で解決できると思うがそれもちょっと面倒だ。
そこで、Cとしてコンパイル可能なところはCで、C++としてコンパイル可能なところではC++でコンパイルしてみると、最後のリンク時にエラーとなった。C++だと名前マングルがあるので矛盾が生じてしまったようだ。必要な箇所にextern"C"をちりばめれば解決できるが、それもやはり面倒だ。
拡張としてはちょっとしたものでも、本質的な言語機能にかかわる部分だと一旦利用すると簡単に除去できなかったりこともある。むやみにいじろうとすると大抵が泥沼に陥る。何かオプションをいじる程度で解決できないか、コンパイラのマニュアルでも読んでみよう。
Document ID: 8bdbe7c80230181e4d7c2f4187de66e4