代码之家  ›  专栏  ›  技术社区  ›  WilliamKF

编译器版本号的gcc预定义宏是什么?

  •  23
  • WilliamKF  · 技术社区  · 15 年前

    我遇到了一个gcc v3.4.4的bug,在我的代码中放一个ifdef来解决这个bug,只针对那个版本的编译器。

    什么是GCC编译器预处理器预定义的宏来检测编译器的版本号?

    4 回复  |  直到 15 年前
        1
  •  31
  •   DigitalRoss    15 年前

    来自GNU CPP手册…


    __GNUC__
    __GNUC_MINOR__
    __GNUC_PATCHLEVEL__
    

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

    _ GNUC_补丁级别__ 是GCC 3.0的新特性;它也出现在3.0之前广泛使用的开发快照中(根据您拥有的快照,这些快照将自己标识为GCC 2.96或2.97)。

    如果您所需要知道的只是您的程序是否由gcc编译,或者是一个声称接受gnu c方言的非gcc编译器,那么您可以简单地测试 第二节 . 如果您需要编写依赖于特定版本的代码,则必须更加小心。每次次要版本增加时,补丁级别重置为零;每次主要版本增加(很少发生)时,次要版本和补丁级别重置。如果希望直接在条件中使用预定义的宏,则需要这样编写:

              /* Test for GCC > 3.2.0 */
              #if __GNUC__ > 3 || \
                  (__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
                                     (__GNUC_MINOR__ == 2 && \
                                      __GNUC_PATCHLEVEL__ > 0))
    
        2
  •  18
  •   Gregory Pakosz    15 年前

    __GNUC__ , __GNUC_MINOR__ __GNUC_PATCHLEVEL__ .

    例如,GCC4.0.1将:

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

    下面是一条很好记住的命令行,当您想知道在当前编程环境下GNU GCC编译器预先定义的预处理器指令是什么时:

    gcc-e-dm-</dev/null更少

        3
  •  4
  •   nos    15 年前

    有3个宏可以测试gcc版本。

    __GNUC_MINOR__ 
     __GNUC_PATCHLEVEL__ 
     __GNUC__ 
    

    例如,我的GCC第4.3.1版定义如下:

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

    您可以看到通过运行

    gcc-e-dm-x c/dev/null

        4
  •  2
  •   dmckee --- ex-moderator kitten    15 年前

    online docs :

    第二节
    第二章
    _ GNUC_补丁级别__
    这些宏是由使用C预处理器的所有GNU编译器定义的:C、C++、Objto-C和FORTRAN。它们的值是编译器的主版本、次版本和补丁级别,作为整数常量。例如,GCC 3.2.1将定义“GNUC”为3,“GNUC”为2,“GNUC”为1。如果直接调用预处理器,也会定义这些宏。

    第二版
    此宏扩展为字符串常量,该常量描述所用编译器的版本。您不应该依赖于它的内容具有任何特定的形式,但它至少可以包含发布号。