什么是编译器版本号的gcc预定义宏?
我遇到了一个gcc v3.4.4的错误,以及在我的代码中放置了一个#ifdef来解决只有该版本的编译器的错误。什么是编译器版本号的gcc预定义宏?
什么是GCC编译器预处理器预定义的宏来检测编译器的版本号?
从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))
在预处理宏的末尾缺少权限paren? – user318904 2014-08-11 19:57:41
是我还是铛有相同的\ GNU \ _ \ _定义?所以不是一个真正的测试gcc? – Bram 2016-08-31 20:23:48
__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的|少
从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__
该宏展开为一个字符串常量,它描述在用编译器的版本。您不应该依赖其具有任何特定形式的内容,但可以指望至少包含发行版号。
有针对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的
可能的重复[如何测试当前版本的GCC?](http://stackoverflow.com/questions/259248/how-do-i-test-the-current-version-of-gcc),通用C/C++ – 2014-09-17 14:53:15