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

Wil*_*mKF 27 flags gcc preprocessor g++ version

我遇到了一个gcc v3.4.4的错误,并且在我的代码中添加#ifdef来解决该版本编译器的bug.

什么是GCC编译器预处理器预定义宏来检测编译器的版本号?

Dig*_*oss 37

来自gnu cpp手册......


__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
Run Code Online (Sandbox Code Playgroud)

这些宏由所有使用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)))
Run Code Online (Sandbox Code Playgroud)


Gre*_*osz 18

__GNUC__,__GNUC_MINOR____GNUC_PATCHLEVEL__.

例如,GCC 4.0.1将执行:

#define __GNUC__ 4
#define __GNUC_MINOR__ 0
#define __GNUC_PATCHLEVEL__ 1
Run Code Online (Sandbox Code Playgroud)

当你想知道在你当前的编程环境下由GNU GCC编译器定义的预定义预处理器指令时,这是一个很好的记忆线:

gcc -E -dM - </ dev/null | less

  • GCC预测处理器指令的好处.排序时更好:`gcc -E -dM - </ dev/null | 排序| less` (4认同)