web-dev-qa-db-ja.com

GNU C ++マクロ__cplusplus標準に準拠していますか?

Gnu C++コンパイラは__cplusplus1と定義しているようです

#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

そのようなスイッチを実装するためのシンプルで合理的に移植可能な方法はありますか?

33
towi

これは約1か月前に修正されました(gcc 4.7.0の場合)。バグレポートは興味深い読み物になります: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=177

30
Kusalananda

私が正しく思い出した場合、これはSolaris 8に関係しており、__cplusplusが設定されています。 gccチームは、この特定の条項に準拠するのではなく、Solaris 8プラットフォームをサポートすることを当時決定しました。しかし、gccの最新バージョンがSolaris 8のサポートを終了していることに気づきました。これは正しい方向への最初のステップだと思います。

1
wilhelmtell

これは非常に古いg ++バグです。

つまり、コンパイラは適合していません。

どうやらそれを修正することはクレイジーなプラットフォームで何かを壊してしまうので、修正することはできないようです。

[〜#〜] edit [〜#〜]:おお、バージョン4.7.0で修正された@birryreeのコメントからわかります。だから、結局直せなかったわけではない。へえ。

乾杯&hth。