web-dev-qa-db-ja.com

GNU C ++ -std = c ++ 0xが有効な場合の確認方法は?

私のシステムコンパイラ(gcc42)は、必要なTR1機能で正常に動作しますが、システム以外の新しいコンパイラバージョンをサポートしようとし、TR1ヘッダーにアクセスしようとしています。ライブラリまたはそのようなハブbubとのインターフェース。

/usr/local/lib/gcc45/include/c++/bits/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.

このシステム(FreeBSD)でGCC 4.4および4.5をサポートするために、追加のスイッチを用意する必要は問題ありませんが、明らかに状況が変わります!

私のシステムコンパイラ(g ++ 4.2デフォルトの方言)の使用:

#include <tr1/foo>
using std::tr1::foo;

-std = c ++ 0xを指定した新しいバージョン(4.5)のコンパイラーの使用:

#include <foo>
using std::foo;

とにかくプリプロセッサを使用していますか?C++ 0x機能を有効にしてg ++が実行されているかどうかを確認できますか?

このようなものが私が探しているものです

#ifdef __CXX0X_MODE__
#endif

しかし、マニュアルやWebからは何も見つかりませんでした。

この速度で、私は、Boostを依存関係として使用する方が、より簡単で、TR4の前に新しい言語標準が登場することを心配する必要がないと思い始めています...へへ。

37
TerryP

-std=c++0xでコンパイルすると、__GXX_EXPERIMENTAL_CXX0X__が定義されます。

36
James McNellis

Gcc 4.4.4では、-std = c ++ 0xが有効であることを示唆する定義済みのマクロが1つしかないようです。

#define __GXX_EXPERIMENTAL_CXX0X__ 1

私はgcc 4.5.0にアクセスできませんが、自分で確認できます。

[16:13:41 0 ~] $ g++ -E -dM -std=c++0x -x c++ /dev/null >b
[16:13:44 0 ~] $ g++ -E -dM -std=c++98 -x c++ /dev/null >a
[16:13:50 0 ~] $ diff -u a b
--- a   2010-06-02 16:13:50.200787591 +0200
+++ b   2010-06-02 16:13:44.456912378 +0200
@@ -20,6 +20,7 @@
 #define __linux 1
 #define __DEC32_EPSILON__ 1E-6DF
 #define __unix 1
+#define __GXX_EXPERIMENTAL_CXX0X__ 1
 #define __LDBL_MAX_EXP__ 16384
 #define __linux__ 1
 #define __SCHAR_MAX__ 127

1行のコマンドで、

g++ -E -dM -std=c++98 -x c++ /dev/null > std1 && g++ -E -dM -std=c++0x -x c++ /dev/null > std2 && diff -u std1 std2 | grep '[+|-]^*#define' && rm std1 std2

あなたに次のようなものを与えます:

+#define __GXX_EXPERIMENTAL_CXX0X__ 1
82
nos

gcc-4.7 以降では、__ cplusplusを確認できます。

「G ++は事前定義されたマクロ__cplusplusを正しい値に設定するようになりました。C++ 98/03の場合は199711L、C++ 11の場合は201103Lです。」

これは、標準に準拠した正しい方法である必要があります。残念ながら、実際にインストールされているほとんどのgccでは機能しません。

17
emsr