31

我遇到了 gcc v3.4.4 的错误,并且在我的代码中放置了一个 #ifdef 以解决该错误仅适用于该版本的编译器。

GCC编译器预处理器预定义的宏来检测编译器的版本号有哪些?

4

4 回答 4

41

从 gnu cpp 手册...


__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__

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

__GNUC_PATCHLEVEL__是 GCC 3.0 的新手;它也出现在 3.0 之前的广泛使用的开发快照中(根据您拥有的快照,它们将自己标识为 GCC 2.96 或 2.97)。

如果您只需要知道您的程序是否正在由 GCC 编译,或者声称接受 GNU C 方言的非 GCC 编译器,您可以简单地测试__GNUC__. 如果您需要编写依赖于特定版本的代码,则必须更加小心。每次增加次要版本,补丁级别重置为零;每次增加主要版本(这种情况很少发生)时,都会重置次要版本和补丁级别。如果您希望直接在条件中使用预定义的宏,则需要这样编写:

          /* Test for GCC > 3.2.0 */
          #if __GNUC__ > 3 || \
              (__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
                                 (__GNUC_MINOR__ == 2 && \
                                  __GNUC_PATCHLEVEL__ > 0)))
于 2009-12-20T19:38:16.800 回答
21

__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

于 2009-12-20T19:34:59.010 回答
4

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

__GNUC_MINOR__ 
 __GNUC_PATCHLEVEL__ 
 __GNUC__ 

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

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

您可以看到通过运行定义的“buitin”宏

gcc -E -dM -xc /dev/null

于 2009-12-20T19:40:18.310 回答
2

来自在线文档

__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__
这个宏扩展为一个字符串常量,它描述了正在使用的编译器的版本。您不应依赖其内容具有任何特定形式,但可以指望它至少包含版本号。

于 2009-12-20T19:36:27.180 回答