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

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

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

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

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

  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在线文档。

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

如果出于某种原因,我们在项目中使用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;
}

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

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

此处列出了其他相关的宏。

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

来自GCC文件:

如果使用了传统的cpp选项,则不会定义此宏,也不会编译C++或Objective-C时。

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

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

对于MSVC,以下代码:

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

可以使用。

最新更新