サポートしている 言語規格一覧の確認
g++ -v --help 2>/dev/null | grep -E "^\s+\-std=.*$"
言語規格の指定方法
export CXXFLAGS="-std=gnu++98"
ABI互換性
どの言語規格を指定すればよいか
GCC(より具体的には、libstdc++)は、ABIの安定性を保証するために労を惜しみませんが、この保証はlibstdc++の中のC++のすべての部分に及ぶわけではありません。公式には、3.4以降のバージョンにおいて、GCC/libstdc++はC++98/C++03 ABIの安定性のみを保証し、それ以上ではありません。このことはC++11に依存するパッケージに関しては重大です。GCCはC++11 ABIの安定性の保証をバージョン5.1以降でのみ提供しています。これは、gccのバージョン(マイナーバージョンであっても)の変更(4.7.3 -> 4.7.4など)はC++11のコードからビルドされたバイナリにABI破壊をもたらす、ということを意味しています。
ということから、C++98 か C++03 、そしてGCC5.1以降では C++11 を指定することも良いようですね。
江添さんがC++11について本を出されたのは久しぶりのメジャーアップデートだったからなのでしょう。 本の虫: C++11参考書の公開:C++11の文法と機能
- 昔は C++11 は C++0x と呼ばれていた。
- C++14はC++11のマイナーアップデート。
- C++17 は メジャーアップデート
なお C++11の文法と機能 について C++11: Syntax and Featureで読むことができる。
GCC 4.1 / GCC 5.1
そう、C++です、ほとんどの非互換はC++ ABIの中で生じるためです。もしあなたがGCC 4.1やGCC 5.1へアップグレードした場合、おそらくABIの問題に直面することになるでしょう。
これを防ぐには、GCC 3からGCC 4.1へのアップグレードの場合はlibstdc++.so.5に、GCC 4からGCC 5.1へのアップグレードの場合はlibstdc++.so.6に対して(略)