2011-08-28 29 views
23

コードで標準を識別できるように、C++用に事前定義されたマクロはありますか?C++ 11定義済みマクロ

現在、ほとんどのコンパイラは "array"を "tr1"フォルダに置きますが、C++ 11ではSTLの一部になります。だから、現在

#include <tr1/array> 

が、C++ 11

#include <array> 

は、私が識別するために#ifdefを使用することができますために、03の標準と11の標準のための定義済みマクロは何ですか?

また、C90とC99のマクロがあるとしますか?

Thanksx

+1

これは、標準とはほとんどを持っている、それは完全にあなたのコンパイラがサポートしているかに依存します。どのコンパイラもバージョン番号を与えるマクロをあらかじめ定義しています。コンパイラーの資料を参照してください。 –

+0

[C++ 0x可用性の決定]の可能な複製(http:// stackoverflow。com/questions/1975616/determine-c0x-availability) –

+3

@Hans Passant:失敗します。 '_ _ cplusplusという名前は、C++翻訳単位をコンパイルするときの値201103Lに定義されています。 '(16.8事前定義されたマクロ名)。 –

答えて

20

here C++ 0Xで

からマクロ__cplusplus現在199711L(より大きい)から を異なる値に設定されます。

あなたはおそらく、それがその後、最終的に

+1

これはおそらく最善のことですが、悲しいことにVC++(sigh)ではうまくいきません。現在のVC++(VS2010用)は199711Lとして '__cplusplus'を定義していますが、' tr1/array'の 'array'はまだありません(ただし、tr1名前空間で定義されています) – Voo

+0

私は彼らが難しい立場にあったと思う。彼らは0xに準拠していると主張することはできませんでした。なぜなら、それらの一部しか実装していなかったからです。標準はまだとにかく遠かったですが、標準に準拠して行った部品を実装したい... – jcoder

+1

GCC '__cplusplus'が数週間前に' 1'以外のもの(注: '199711L'でもない)を報告するように修正したので、4.7.0が出るまでGCCでも動作しません。また、バグアーカイブからは、C++ 0xビルドのバットから '199711L'よりも大きなものをサポートするかどうかは完全には分かりません(しかし、私はそれを推測しています)。 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 - 10 +年のバグを参照してください。 –

1

C++ 0xのだかどうかを決定するための値ですテストすることができ、あなたは、コンパイラ固有の情報を利用する必要があるとしています。少なくとも、C++ 0xがより広く普及するまで。基本的には、何かを実装しているコンパイラ固有のマクロをテストするドライバのバージョンを選ぶ必要があります。

Boost.Configライブラリには、多数のマクロがあります。

7

Nitpick ...

あなたの特定の問題は、あなたのコンパイラに依存しない、それが標準ライブラリの実装に依存します。

コンパイラによって提供されたものとは別の標準ライブラリ(例えば、libC++やstlportを試してみる)を自由に選ぶことができるので、コンパイラ固有の情報はここでは役に立ちません。

したがって、特定のヘッダーファイルを自分で作成することをお勧めします。ビルドオプションに応じてどちらか一方を選択します。 -DSTD_HAS_TR1_ARRAY_HEADERを渡す

std::tr1::arrayはなく、デフォルト<array><tr1/array>に定義されていることを意味します:

// array.hpp 
#ifdef STD_HAS_TR1_ARRAY_HEADER 
#include <tr1/array> 
#else 
#include <array> 
#endif 

はその後、コンパイラオプションを文書化します。

これで完了です。

6

ドラフトN3242から:

16.8 Predefined macro names       [cpp.predefined] 
... 
    The name _ _ cplusplus is defined to the value 201103L when 
    compiling a C++ translation unit. 155) 
... 
155) It is intended that future versions of this standard will 
    replace the value of this macro with a greater value. 
    Non-conforming compilers should use a value with at most five 
    decimal digits. 
関連する問題