C++

互換性

C++規格に準拠したコンパイラを開発するのは一般的に難しい。何年にも渡りC++に部分的に準拠した様々なコンパイラが作られ、テンプレートの部分特殊化などの部分で実装にばらつきがあった。最近のメジャーなC++コンパイラは1998年の規格にほぼ準拠している(※http://www.ddj.com/dept/cpp/184401381C++ Conformance RoundupDr. Dobb's JournalHerb Sutter2003-04-152006-05-30)。規格に完全に準拠する実装は恐らくまだ無いと考えられる。テンプレートの宣言と実装を分離できるようにするためのexportは問題のキーワードの一つである。規格がリリースされてから5年後の2003年前半にComeau C/C++が初めてexportを実装した。2004年にBorland C++ Builder Xexportを実装した。これらのコンパイラはいずれもEDGのフロントエンドをベースにしていた。大半のコンパイラで実装されていないexportは多くのC++関連書籍(例えばBeginning ANSI C++ Ivor Horton著)にサンプルが記されているが、exportが記載されていることによる問題は特に指摘されていないということも注目すべき点である。GCCをはじめとするその他のコンパイラでは全くサポートしていない。Herb SutterはC++の標準規格からexportを削除することを推奨していたが(※ Why We Can’t Afford Export266 KB)、最終的にこれを残すことで決定している(※http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1459.htmlMinutes of J16 Meeting No. 36/WG21 Meeting No. 31, April 7-11, 20032003-04-252006-09-04)。コンパイラ開発者の裁量で決められる範囲を確保するため、C++標準化委員会は名前修飾例外処理などの実装に依存する機能の実装方法を決定しないことに決めた。この決定の問題はコンパイラが異なるとオブジェクトファイルの互換性が保証されない点である。特定の機種やOSでコンパイラの互換性を持たせようとするABI(※http://www.codesourcery.com/cxx-abi/C++ ABI2006-05-30)のような非標準の規格もあり、一部のコンパイラではこうした準規格を採用している。

戻る