【问题标题】:Output Compiler Version in a C++ ProgramC++ 程序中的输出编译器版本
【发布时间】:2016-11-26 15:00:11
【问题描述】:

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

为了简化问题,我的代码类似于

#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

我尝试编译,报错:

$ 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;
           ^

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

【问题讨论】:

  • 没有跨不同编译器获取该信息的标准化方法。

标签: c++ gcc


【解决方案1】:

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

  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

ver_string 的定义位置:

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

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

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

gcc online docs

如果您需要处理 MSVC 和其他可能性,则必须检查它们使用的宏,我不记得它们了。

【讨论】:

  • 请注意,__VERSION__ 由 GCC 定义,而不是任何标准。
  • 当然,您可以做得比让函数返回带有以下代码的字符串更好:#define STRINGIFY(x) #x#define VER_STRING(major, minor, patch) STRINGIFY(major) "." STRINGIFY(minor) "." STRINGIFY(patch)。然后你可以使用std::string true_cxx_ver = VER_STRING(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
  • 是的,我同意,这要好得多。我忘了你可以像这样对数字进行字符串化。
【解决方案2】:

__STDC_VERSION__ 是 C 标准库的版本。它不是 C++ 的一部分,也不是编译器的版本。

来自 GCC 的文档:

如果使用 -traditional-cpp 选项,则未定义此宏,也 在编译 C++ 或 Objective-C 时。

相当于__cplusplus,它会告诉你编译器使用的C++标准版本。

编译器版本宏是特定于供应商的,对于 GCC,它们是 __GNUC____GNUC_MINOR____GNUC_PATCHLEVEL__

【讨论】:

    【解决方案3】:

    对于 MSVC 以下代码:

    #ifdef _MSC_VER
        std::to_string(_MSC_VER)
    #endif
    

    可以使用。

    【讨论】:

      【解决方案4】:

      如果出于某种原因我们在项目中使用Boost library,我们可以使用#include &lt;boost/config.hpp&gt; 中定义的宏。

      以下代码:

      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;
      }
      

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

      [Win32/Microsoft Visual C++ version 14.1](May 10 2019)
      

      列出了其他相关的宏here

      【讨论】:

      • 那很好.. 有没有办法也打印架构(x86 vs x64)?
      • 我不认为通过 boost,作为一种解决方法,您可以使用 #ifdef 指令 (stackoverflow.com/questions/1505582/…) 和架构的硬编码字符串。
      • 因为这些宏是字符串字面量,你可以这样做const char* get_compile_version() { return "[" BOOST_PLATFORM "/" BOOST_COMPILER "](" __DATE__ ")"; }
      猜你喜欢
      • 2021-11-26
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多