【问题标题】:How to test the current version of GCC at compile time?如何在编译时测试当前版本的 GCC?
【发布时间】:2010-09-20 12:42:53
【问题描述】:

我想根据 GCC 的版本包含不同的文件。更确切地说,我想写:

#if GCC_VERSION >= 4.2
#  include <unordered_map>
#  define EXT std
#elif GCC_VERSION >= 4
#  include <tr1/unordered_map>
#  define EXT std
#else
#  include <ext/hash_map>
#  define unordered_map __gnu_cxx::hash_map
#  define EXT __gnu_cxx
#endif

3.2之前的gcc我不关心。

我很确定在预处理时为此定义了一个变量,但我再也找不到它了。

【问题讨论】:

    标签: c++ c gcc versions


    【解决方案1】:

    应根据您的需要定义许多宏:

    __GNUC__              // major
    __GNUC_MINOR__        // minor
    __GNUC_PATCHLEVEL__   // patch
    

    版本格式为major.minor.patch,e.g. 4.0.2

    这些文档可以在here找到。

    【讨论】:

      【解决方案2】:

      好的,经过更多搜索,一种可能的方法是使用features.h 中定义的__GNUC_PREREQ

      #ifdef __GNUC__
      #  include <features.h>
      #  if __GNUC_PREREQ(4,0)
      //      If  gcc_version >= 4.0
      #  elif __GNUC_PREREQ(3,2)
      //       If gcc_version >= 3.2
      #  else
      //       Else
      #  endif
      #else
      //    If not gcc
      #endif
      

      【讨论】:

      • 不幸的是,此代码在 clang 编译器中失败,该编译器定义了 __GNUC__,但不包括 features.h
      • 嗯,这段代码是为了知道GCC的版本,所以clang部分模拟GCC失败也就不足为奇了。
      • 对不起,我好像错了。 features.h 包含只是 Linux 特定的东西,不应依赖于任何旨在在其他平台上编译的代码。
      • 这段代码已经在 Mac OS X、Windows(MingW32 和 MingW64)和 Linux 上测试过……我很确定 features.h 是一个 GCC 特定的包含文件。
      • 该文件不是直接来自 GCC,而是来自 glibc 项目。当然,你不能根据当前编译器假设这个文件的存在。
      【解决方案3】:

      附注:

      要查找所有预定义的宏:

      • 创建空文件 t.cpp
      • g++ -E -dM t.cpp

      【讨论】:

      • 不创建空文件:g++ -E -dM - /null
      • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
      • @LawrenceAiello:你的评论只晚了 7 年。
      • @LawrenceAiello:似乎已被编辑,只是在一行中添加了代码引号(并已获得批准)。
      猜你喜欢
      • 2015-10-08
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多