编译器版本号的gcc预定义宏是什么?

3b6akqbq  于 2023-05-18  发布在  其他
关注(0)|答案(5)|浏览(179)

我在gcc v3.4.4中遇到了一个bug,我在代码中放置了一个#ifdef来解决这个bug,只针对那个版本的编译器。
什么是GCC编译器预处理器预定义的宏来检测编译器的版本号?

yvt65v4c

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__。如果您需要编写依赖于特定版本的代码,则必须更加小心。每增加一次次要版本,补丁级别重置为零;每次增加主版本(很少发生)时,重置次版本和补丁级别。如果你想直接在条件中使用预定义的宏,你需要这样写:

/* Test for GCC > 3.2.0 */
          #if __GNUC__ > 3 || \
              (__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
                                 (__GNUC_MINOR__ == 2 && \
                                  __GNUC_PATCHLEVEL__ > 0)))
wnavrhmk

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|少

ego6inou

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

xwbd5t1u

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。如果直接调用预处理器,也会定义这些宏。

    版本
    此宏扩展为一个字符串常量,用于描述所用编译器的版本。你不应该依赖于它的内容有任何特定的形式,但它可以指望至少包含发行号。
4xy9mtcn

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__)

就像我写的大部分代码一样,我写了一个单元测试,这样我就可以说,除非你给它输入无效的数据,否则测试不太可能失败(著名的最后一句话)。

相关问题