2009-12-20 210 views
18

我遇到了一个gcc v3.4.4的错误,以及在我的代码中放置了一个#ifdef来解决只有该版本的编译器的错误。什么是编译器版本号的gcc预定义宏?

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

+1

可能的重复[如何测试当前版本的GCC?](http://stackoverflow.com/questions/259248/how-do-i-test-the-current-version-of-gcc),通用C/C++ – 2014-09-17 14:53:15

回答

26

从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

在预处理宏的末尾缺少权限paren? – user318904 2014-08-11 19:57:41

+0

是我还是铛有相同的\ GNU \ _ \ _定义?所以不是一个真正的测试gcc? – Bram 2016-08-31 20:23:48

15

__GNUC__,__GNUC_MINOR____GNUC_PATCHLEVEL__

例如,GCC 4.0.1会做:

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

这里是一个小的命令行是不错的,当你想知道这是本prede网络斯内德预处理指令去连接由GNU GCC编译器下定义记住你当前的编程环境:

GCC-E -dM - <的/ dev/null的|少

+4

GCC预先指定的预处理器指令的好处。排序时更好: 'gcc -E -dM - Bart 2013-08-07 10:57:35

+0

谢谢你的提示 - 运行''gcc -E -dM - Phil 2016-11-09 14:40:03

1

online docs:C,C++,Objective-C和Fortran的:

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

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

4

有针对gcc版本,你可以测试3个宏。

__GNUC_MINOR__ 
__GNUC_PATCHLEVEL__ 
__GNUC__ 

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

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

就可以看到运行中定义的 “buitin” 宏

的gcc -E -dM -xc的/ dev/null的

相关问题