C++ 5.0 コンパイラには、「標準」モードと「互換」モードの 2 つの動作モードがあります。
標準モードでは、C++ 国際標準の大部分の仕様が実装されており、C++ 4 で受け入れられていた言語とソースレベルの互換性の問題がいくつかあります。
さらに重要なことに、C++ 5.0 コンパイラは、標準モードでは、C++ 4.2 とは異なるアプリケーションバイナリインタフェース (ABI) を使用します。このため、一般的に、標準モードで生成されたコードと 4.2 コンパイラで生成されたコードとの間には互換性がなく、リンクすることはできません。この問題については、「バイナリ互換の問題」でさらに説明します。
既存のコードを 5.0 の標準モードでコンパイルするには、いくつかの修正が必要です。修正が必要な理由としては、以下が挙げられます。
64 ビットのプログラムに対して互換モードは使用できない。
互換モードでは、C++ の重要な標準機能を使用できない。
C++ 標準に準拠した新しいコードを互換モードでコンパイルできないことがある。つまり、将来アプリケーションに新しいコードを追加できなくなる。
4.2 のコードと標準モードの C++コードとをリンクできないため、2 つのバージョンのオブジェクトライブラリの維持管理が必要になる可能性がある。
将来、互換モードは廃止される。
C++ 5.0 コンパイラには、C++ 4.2 から C++ 5.0 標準モードへの移行のために互換モードが用意されています。互換モードでは、C++ 4.2 コンパイラと、バイナリレベルでは完全な互換性が、ソースレベルではほぼ完全な互換性が保たれます (「互換性」とは、「上位互換性」を意味します)。古いソースコードおよびバイナリコードは、新しいコンパイラで動作できますが、この逆に、新しいコンパイラ用に作成されたコードが古いコンパイラで動作するとは限りません) 。ただし、互換モードと標準モードとの間にバイナリレベルの互換性はありません。互換モードは、Solaris 2.5.1、2.6、7 のいずれかを実行する Intel および SPARC で使用できます。ただし、SPARC v9 (64 ビット対応の Solaris 7) で使用することはできません。
互換モードを使用する理由としては、以下が挙げられます。
たとえば、5.0 用のソースコードがないために、4.2 コンパイラでコンパイルした C++ オブジェクトライブラリを 5.0 コンパイラの標準モードで再コンパイルできない。
製品をすぐに出荷する必要があるのだが、その製品のソースコードが 5.0 コンパイラの標準モードではコンパイルできない。