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