2016-07-22 8 views
1

コードをコンパイルする際に、コンパイラのバージョン情報を必要とするプログラムを作成しています。問題を単純化するためにC++プログラムでの出力コンパイラのバージョン

、私のコードは、それがコンパイルされ、それが実行されると、私は期待でしょう

#include <cstdlib> 
#include <iostream> 

using namespace std; 

int main(int argc, char** argv) { 

    cout<<"The C++ compiler version is: "<<__STDC_VERSION__<<endl; 

    return 0; 
} 

のようなもので、それは出力になります。

C++コンパイラのバージョンがある:GCC 5.3.0

私はそれをコンパイルしようとした、およびエラーを得た:

​​

私のコードでコンパイラのバージョンを正しく取得するには?

+3

ある

コンパイラのバージョンのマクロは異なるコンパイラ間でその情報を取得するための標準化方法はありません、ベンダー固有のものです。 –

答えて

2

私はかつて、このようなコードを使用:

ver_stringが定義された
std::string true_cxx = 
#ifdef __clang__ 
    "clang++"; 
#else 
    "g++"; 
#endif 

    std::string true_cxx_ver = 
#ifdef __clang__ 
    ver_string(__clang_major__, __clang_minor__, __clang_patchlevel__); 
#else 
    ver_string(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__); 
#endif 

を:

std::string ver_string(int a, int b, int c) { 
    std::ostringstream ss; 
    ss << a << '.' << b << '.' << c; 
    return ss.str(); 
} 

このため(GCCと打ち鳴らす上の)別の有用なマクロもあります:

__VERSION__ This macro expands to a string constant which describes the version of the compiler in use. You should not rely on its contents having any particular form, but it can be counted on to contain at least the release number.

gcc online docsを参照してください。

MSVCなどの可能性を処理する必要がある場合は、使用しているマクロを確認する必要がありますが、私はそれらを覚えていません。

+0

'__VERSION__'はGCCで定義されています。標準ではありません。 –

+3

確かに、 '#define STRINGIFY(x)#x'と ' #define VER_STRING(メジャー、マイナー、パッチ)STRINGIFY(メジャー) "のようなコードで関数を返すよりも、 STRINGIFY(マイナー) " STRINGIFY(パッチ) '次に 'std :: string true_cxx_ver = VER_STRING(__ GNUC__、__GNUC_MINOR__、__GNUC_PATCHLEVEL __);'を使うことができます。 –

+0

ええ、それははるかに良いことに同意します。私はあなたが好きな数字をストリングできることを忘れていました。 –

2

__STDC_VERSION__は、C標準ライブラリのバージョンです。これはC++の一部ではなく、コンパイラのバージョンではありません。 GCCのマニュアルから

This macro is not defined if the -traditional-cpp option is used, nor when compiling C++ or Objective-C.

それは同等だが、あなたにC++コンパイラで使用される標準的なバージョンを教えてくれます__cplusplus、です。 GCCのため、彼らは__GNUC____GNUC_MINOR____GNUC_PATCHLEVEL__

関連する問題