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

时间:2009-12-20 19:32:10

标签: gcc g++ version flags preprocessor

我遇到了一个gcc v3.4.4的错误,并且在我的代码中添加#ifdef来解决该版本编译器的错误。

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

4 个答案:

答案 0 :(得分:31)

来自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编译还是非GCC编译器声称接受GNU C方言,你可以简单地测试__GNUC__。如果您需要编写依赖于特定版本的代码,则必须更加小心。每次增加次要版本时,补丁级别将重置为零;每次增加主要版本(很少发生)时,重置次要版本和补丁级别。如果您希望直接在条件中使用预定义的宏,则需要按如下方式编写它:

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

答案 1 :(得分:18)

__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 - < / dev / null | less

答案 2 :(得分:4)

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

__GNUC_MINOR__ 
 __GNUC_PATCHLEVEL__ 
 __GNUC__ 

e.g。我的gcc v 4.3.1将它们定义为:

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

您可以看到通过运行

定义的“buitin”宏
  

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

答案 3 :(得分:2)

来自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.如果直接调用预处理器,也会定义这些宏。

  

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