Gnu C++コンパイラは__cplusplus
を1
と定義しているようです
#include <iostream>
int main() {
std::cout << __cplusplus << std::endl;
}
これは、標準のC++モードのgccで1
を出力します。C++ 0xモードの場合も gcc 4.3.4 で、gcc 4.7.0を出力します。
C++ 11 FDISは "16.8定義済みマクロ名[cpp.predefined]"
名前
__cplusplus
は、C++変換単位をコンパイルするときにvalue 201103Lに定義されます。 (脚注:この標準の将来のバージョンでは、このマクロの値をより大きな値に置き換える予定です。非準拠のコンパイラーは、最大で5桁の10進数の値を使用する必要があります。)
古いstd C++ 03にも同様のルールがありました。
GCCはこれを1
に慎重に設定していますか。「非準拠」であるためです?
そのリストを読むことで、__cplusplus
を使用して、C++ 11対応のコンパイラがあるかどうかをポータブルな方法で確認できると思いました。しかし、g ++では、これは機能しないようです。私は...EXPERIMENTAL...
マクロについて知っていますが、g ++が__cplusplus
をこのように定義している理由を知りました。
私の最初の問題は、異なるnullポインターバリアント間の切り替えでした。このようなもの:
#if __cplusplus > 201100L
# define MYNULL nullptr
#else
# define MYNULL NULL
#endif
そのようなスイッチを実装するためのシンプルで合理的に移植可能な方法はありますか?
これは約1か月前に修正されました(gcc 4.7.0の場合)。バグレポートは興味深い読み物になります: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=177
私が正しく思い出した場合、これはSolaris 8に関係しており、__cplusplus
が設定されています。 gccチームは、この特定の条項に準拠するのではなく、Solaris 8プラットフォームをサポートすることを当時決定しました。しかし、gccの最新バージョンがSolaris 8のサポートを終了していることに気づきました。これは正しい方向への最初のステップだと思います。
これは非常に古いg ++バグです。
つまり、コンパイラは適合していません。
どうやらそれを修正することはクレイジーなプラットフォームで何かを壊してしまうので、修正することはできないようです。
[〜#〜] edit [〜#〜]:おお、バージョン4.7.0で修正された@birryreeのコメントからわかります。だから、結局直せなかったわけではない。へえ。
乾杯&hth。