我遇到了一个gcc v3.4.4的错误,并且在我的代码中添加#ifdef来解决该版本编译器的错误。
什么是GCC编译器预处理器预定义宏来检测编译器的版本号?
答案 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__
此宏扩展为字符串常量,该常量描述正在使用的编译器的版本。您不应该依赖具有任何特定形式的内容,但可以指望它至少包含版本号。