我在gcc v3.4.4中遇到了一个bug,我在代码中放置了一个#ifdef来解决这个bug,只针对那个版本的编译器。什么是GCC编译器预处理器预定义的宏来检测编译器的版本号?
yvt65v4c1#
来自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编译的,还是由声称接受GNU C方言的非GCC编译器编译的,你可以简单地测试__GNUC__。如果您需要编写依赖于特定版本的代码,则必须更加小心。每增加一次次要版本,补丁级别重置为零;每次增加主版本(很少发生)时,重置次版本和补丁级别。如果你想直接在条件中使用预定义的宏,你需要这样写:
__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
/* Test for GCC > 3.2.0 */ #if __GNUC__ > 3 || \ (__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \ (__GNUC_MINOR__ == 2 && \ __GNUC_PATCHLEVEL__ > 0)))
wnavrhmk2#
__GNUC__、__GNUC_MINOR__和__GNUC_PATCHLEVEL__。例如,GCC 4.0.1将执行以下操作:
#define __GNUC__ 4 #define __GNUC_MINOR__ 0 #define __GNUC_PATCHLEVEL__ 1
这里有一个小命令行,当你想知道在你当前的编程环境下,GNU GCC编译器定义了哪些是预定义的预处理器指令时,很容易记住:< /dev/null|少
ego6inou3#
gcc版本有3个宏可以测试。
__GNUC_MINOR__ __GNUC_PATCHLEVEL__ __GNUC__
例如,我的gcc v 4.3.1将它们定义为:
#define __GNUC_MINOR__ 1 #define __GNUC_PATCHLEVEL__ 3 #define __GNUC__ 4
您可以看到通过运行gcc -E -dM -x c /dev/null
xwbd5t1u4#
关于online docs:
4xy9mtcn5#
顺便说一下,如果您使用的是glib,那么您可以访问以下宏,该宏可用于检查GNU C/C++编译器版本:
#ifdef __GNUC__ #define G_GNUC_CHECK_VERSION(major, minor) \ ((__GNUC__ > (major)) || \ ((__GNUC__ == (major)) && \ (__GNUC_MINOR__ >= (minor)))) #else #define G_GNUC_CHECK_VERSION(major, minor) 0 #endif
请注意,当您不使用GNU编译器进行编译时,宏总是返回 false(0)。因此,我在snapdev library version.h header中使用了以下宏。在我的例子中,我也想检查补丁,我使用了很多库,所以我写了一个更通用的版本:
#define SNAPDEV_CHECK_VERSION(wanted_major, wanted_minor, wanted_patch, current_major, current_minor, current_patch) \ (((current_major) > (wanted_major)) || \ (((current_major) == (wanted_major)) \ && (((current_minor) > (wanted_minor)) || \ (((current_minor) == (wanted_minor)) \ && ((current_patch) >= (wanted_patch))))))
我有一个专门的GCC检查,所以你不必记住宏的名称,包括版本:
#define SNAPDEV_CHECK_GCC_VERSION(wanted_major, wanted_minor, wanted_patch) \ SNAPDEV_CHECK_VERSION(wanted_major, wanted_minor, wanted_patch, \ __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
就像我写的大部分代码一样,我写了一个单元测试,这样我就可以说,除非你给它输入无效的数据,否则测试不太可能失败(著名的最后一句话)。
5条答案
按热度按时间yvt65v4c1#
来自gnu cpp手册。。
这些宏由所有使用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编译的,还是由声称接受GNU C方言的非GCC编译器编译的,你可以简单地测试
__GNUC__
。如果您需要编写依赖于特定版本的代码,则必须更加小心。每增加一次次要版本,补丁级别重置为零;每次增加主版本(很少发生)时,重置次版本和补丁级别。如果你想直接在条件中使用预定义的宏,你需要这样写:wnavrhmk2#
__GNUC__
、__GNUC_MINOR__
和__GNUC_PATCHLEVEL__
。例如,GCC 4.0.1将执行以下操作:
这里有一个小命令行,当你想知道在你当前的编程环境下,GNU GCC编译器定义了哪些是预定义的预处理器指令时,很容易记住:
< /dev/null|少
ego6inou3#
gcc版本有3个宏可以测试。
例如,我的gcc v 4.3.1将它们定义为:
您可以看到通过运行
gcc -E -dM -x c /dev/null
xwbd5t1u4#
关于online docs:
GNUC_MINOR
GNUC_PATCHLEVEL
这些宏由所有使用C预处理器的GNU编译器定义:C、C++、Objective-C和Fortran。它们的值是编译器的主版本、次版本和补丁级别,以整数常量表示。例如,GCC 3.2.1将__GNUC__定义为3,__GNUC_MINOR__定义为2,__GNUC_PATCHLEVEL__定义为1。如果直接调用预处理器,也会定义这些宏。
和
版本
此宏扩展为一个字符串常量,用于描述所用编译器的版本。你不应该依赖于它的内容有任何特定的形式,但它可以指望至少包含发行号。
4xy9mtcn5#
顺便说一下,如果您使用的是glib,那么您可以访问以下宏,该宏可用于检查GNU C/C++编译器版本:
请注意,当您不使用GNU编译器进行编译时,宏总是返回 false(0)。
因此,我在snapdev library version.h header中使用了以下宏。在我的例子中,我也想检查补丁,我使用了很多库,所以我写了一个更通用的版本:
我有一个专门的GCC检查,所以你不必记住宏的名称,包括版本:
就像我写的大部分代码一样,我写了一个单元测试,这样我就可以说,除非你给它输入无效的数据,否则测试不太可能失败(著名的最后一句话)。