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

问题描述 投票:0回答:5

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

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

#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
5个回答
19
投票

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

  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 和其他可能性,您将必须检查它们使用的宏,我不记得它们。


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

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

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

其他相关宏列于here


4
投票

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

来自 GCC 的文档:

如果使用 -traditional-cpp 选项,则不会定义该宏,也不会 编译 C++ 或 Objective-C 时。

它的等价物是

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

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

__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__


2
投票

对于 MSVC 以下代码:

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

可以用。


0
投票

这个问题有特定于编译器的版本:

将它们放在一起,我们可以创建一个更便携的版本:

#include <cstdio>

#if defined(__GNUC__)
    #if defined(__clang__)
        #define COMPILER_FMT "Clang: %s"
    #else
        #define COMPILER_FMT "GNUC: %s"
    #endif
    #define COMPILER_VERSION __VERSION__
#elif defined(_MSC_VER)
    #define COMPILER_FMT "MSVC: %d"
    #define COMPILER_VERSION _MSC_FULL_VER
#else
    #error Please add your compiler here.
#endif

int main() {
    printf("Built with " COMPILER_FMT "\n", COMPILER_VERSION);
    printf("C++ version: %ld\n", __cplusplus);
}

叮当

使用 Clang 构建:4.2.1 兼容 Clang 7.0.1 (Fedora 7.0.1-6.fc29)

C++版本:201402

海湾合作委员会

使用 GNUC 构建:8.3.1 20190223(红帽 8.3.1-2)

C++版本:201402

我本地的 Visual Studio:

使用 MSVC 构建:190024234

C++版本:199711

© www.soinside.com 2019 - 2024. All rights reserved.