34

Gnu C++ コンパイラは、次のように定義__cplusplusしているようです。1

#include <iostream> 
int main() {
  std::cout << __cplusplus << std::endl;
}

これは、 gcc 4.3.4および gcc 4.7.0 を1使用して、標準の c++ モードおよび C++0x モードでgcc を使用して出力します。

C++11 FDIS は、「16.8 定義済みマクロ名 [cpp.predefined]」で次のように述べています。

この名前は、C++ 翻訳単位のコンパイル時に値 201103L__cplusplusに定義されます。(脚注: この標準の将来のバージョンでは、このマクロの値をより大きな値に置き換える予定です。準拠していないコンパイラは、最大 5 桁の値を使用する必要があります。)

古い std C++03 にも同様のルールがありました。

1「非準拠」であるため、GCCは意図的にこれをに設定していますか?

__cplusplusそのリストを読んで、C++11 が有効なコンパイラを使用している場合、ポータブルな方法でチェックインできると思いました。しかし、g++ ではこれは機能しないようです。マクロについては知っていますが、 g++がこのように定義している...EXPERIMENTAL...理由に興味がありました。__cplusplus

私の最初の問題は、異なる null-pointer-variants 間の切り替えでした。このようなもの:

#if __cplusplus > 201100L
#  define MYNULL nullptr
#else
#  define MYNULL NULL
#endif

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

4

3 に答える 3

32

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

于 2011-09-23T13:59:46.917 に答える
1

私の記憶が正しければ、これは、Solaris 8 が適切に__cplusplus設定されているときに問題を引き起こすことに関係しています。当時、gcc チームは、この特定の条項に準拠するのではなく、Solaris 8 プラットフォームをサポートすることを決定しました。しかし、gcc の最新バージョンでは Solaris 8 のサポートが終了していることに気付きました。これは正しい方向への第一歩だと思います。

于 2011-09-23T13:59:07.683 に答える
0

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

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

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

編集:ああ、バージョン4.7.0で修正されたばかりの@birryreeのコメントからわかります。というわけで、やっぱり直せないわけではありませんでした。へー。

乾杯 & hth。

于 2011-09-23T13:58:03.213 に答える