【问题标题】:What are the gcc predefined macros for the compiler's version number?编译器版本号的 gcc 预定义宏是什么?
【发布时间】:2010-12-28 13:07:55
【问题描述】:

我在 gcc v3.4.4 中遇到了一个错误,我在我的代码中添加了 #ifdef 以解决该错误,仅适用于该版本的编译器。

GCC编译器预处理器预定义的宏来检测编译器的版本号有哪些?

【问题讨论】:

标签: gcc g++ version flags preprocessor


【解决方案1】:

来自 gnu cpp 手册...


__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__

这些宏由所有使用 C 预处理器的 GNU 编译器定义:C、C++、Objective-C 和 Fortran。它们的值是编译器的主要版本、次要版本和补丁级别,作为整数常量。例如,GCC 3.2.1 将 __GNUC__ 定义为 3,__GNUC_MINOR__ 定义为 2,__GNUC_PATCHLEVEL__ 定义为 1。如果您直接调用预处理器,也会定义这些宏。

__GNUC_PATCHLEVEL__ 是 GCC 3.0 的新成员;它也出现在 3.0 之前的广泛使用的开发快照中(根据您拥有的快照,它们将自己标识为 GCC 2.96 或 2.97)。

如果您只需要知道您的程序是否正在由 GCC 编译,还是由声称接受 GNU C 方言的非 GCC 编译器编译,您可以简单地测试 __GNUC__。如果您需要编写依赖于特定版本的代码,则必须更加小心。每次增加次要版本,补丁级别重置为零;每次增加主要版本(这种情况很少发生)时,都会重置次要版本和补丁级别。如果你想直接在条件语句中使用预定义的宏,你需要这样写:

          /* Test for GCC > 3.2.0 */
          #if __GNUC__ > 3 || \
              (__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
                                 (__GNUC_MINOR__ == 2 && \
                                  __GNUC_PATCHLEVEL__ > 0)))

【讨论】:

  • 是我,还是 clang 定义了相同的 __GNUC__?所以不是对 gcc 的真正测试?
【解决方案2】:

__GNUC____GNUC_MINOR____GNUC_PATCHLEVEL__

例如,GCC 4.0.1 可以:

#define __GNUC__ 4
#define __GNUC_MINOR__ 0
#define __GNUC_PATCHLEVEL__ 1

当您想知道在您当前的编程环境下哪些是 GNU GCC 编译器定义的预定义预处理器指令时,请记住以下一个小命令行:

gcc -E -dM - /null |less

【讨论】:

  • GCC 预定义预处理器指令的好技巧。排序后效果更好:gcc -E -dM - < /dev/null | sort | less
  • 感谢您的提示 - 运行 gcc -E -dM - < /dev/null 非常非常很有帮助!
  • 如何在 Windows 上生成这些?
【解决方案3】:

您可以在 gcc 版本上测试 3 个宏。

__GNUC_MINOR__ 
 __GNUC_PATCHLEVEL__ 
 __GNUC__ 

例如我的 gcc v 4.3.1 将它们定义为:

#define __GNUC_MINOR__ 1
#define __GNUC_PATCHLEVEL__ 3
#define __GNUC__ 4

你可以看到通过运行定义的“buitin”宏

gcc -E -dM -x c /dev/null

【讨论】:

    【解决方案4】:

    来自online docs

    __GNUC__
    __GNUC_MINOR__
    __GNUC_PATCHLEVEL__
    这些宏由所有使用 C 预处理器的 GNU 编译器定义:C、C++、Objective-C 和 Fortran。它们的值是编译器的主要版本、次要版本和补丁级别,作为整数常量。例如,GCC 3.2.1 会将 __GNUC__ 定义为 3,将 __GNUC_MINOR__ 定义为 2,并将 __GNUC_PATCHLEVEL__ 定义为 1。如果您直接调用预处理器,也会定义这些宏。

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

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 2012-03-31
      相关资源
      最近更新 更多