C++程序中的输出编译器版本

Ein*_*ing 6 c++ gcc

我正在编写一个程序,在编译代码时需要编译器版本的信息.

为了简化问题,我的代码是这样的

#include <cstdlib>
#include <iostream>

using namespace std;

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

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望一旦它被编译并运行,它将输出:

C++编译器版本是:gcc 5.3.0

我试图编译它,并得到一个错误:

$ g++ main.cpp 
main.cpp: In function ‘int main(int, char**)’:
main.cpp:24:11: error: ‘__STDC_VERSION__’ was not declared in this scope
     cout<<__STDC_VERSION__<<endl;
           ^
Run Code Online (Sandbox Code Playgroud)

如何在我的代码中正确获取编译器版本?

Chr*_*eck 8

我曾经使用过这样的代码:

  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
Run Code Online (Sandbox Code Playgroud)

在哪里ver_string定义:

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

还有另一个有用的宏(在gcc和clang上):

__VERSION__ 此宏扩展为字符串常量,该常量描述正在使用的编译器的版本.您不应该依赖具有任何特定形式的内容,但可以指望它至少包含版本号.

请参阅gcc在线文档.

如果你需要处理MSVC和其他可能性,你将不得不检查他们使用的宏,我不记得他们的副手.

  • 当然,你可以做的更好,让函数返回一个代码如下的字符串:`#define STRINGIFY(x)#x`和`#define VER_STRING(major,minor,patch)STRINGIFY(major)"." STRINGIFY(未成年人)"." 字符串化(补丁)`.然后你可以使用`std :: string true_cxx_ver = VER_STRING(__ GNUC __,__ GNUC_MINOR __,__ GNUC_PATCHLEVEL __);`. (4认同)
  • 请注意,`__VERSION__` 是由 GCC 定义的,而不是任何标准。 (2认同)

Mal*_*ick 7

如果由于某种原因我们在项目中使用Boost 库#include <boost/config.hpp>,我们可以使用.

下面的代码:

std::string get_compile_version()
{
     char buffer[sizeof(BOOST_PLATFORM) + sizeof(BOOST_COMPILER) +sizeof(__DATE__ )+ 5];
     sprintf(buffer, "[%s/%s](%s)", BOOST_PLATFORM, BOOST_COMPILER, __DATE__);
     std::string compileinfo(buffer);
     return compileinfo;
}
Run Code Online (Sandbox Code Playgroud)

to std::cout 在我的机器上打印以下内容:

[Win32/Microsoft Visual C++ version 14.1](May 10 2019)
Run Code Online (Sandbox Code Playgroud)

此处列出了其他相关宏。

  • 由于这些宏是字符串文字,因此您可以执行 `const char* get_compile_version() { return "[" BOOST_PLATFORM "/" BOOST_COMPILER "](" __DATE__ ")"; }` (3认同)