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

编译器的gcc预定义宏是什么';谁的版本号?,gcc,g++,version,flags,preprocessor,Gcc,G++,Version,Flags,Preprocessor,我在gcc v3.4.4中遇到了一个bug,我需要在代码中添加一个#ifdef来解决该编译器版本的bug GCC编译器预处理器预定义了哪些宏来检测编译器的版本号?\uuuu GNUC\uuuu、\uu GNUC\u MINOR\uuuu和\uu GNUC\u PATCHLEVEL\uuu 例如,GCC 4.0.1将执行以下操作: #define __GNUC__ 4 #define __GNUC_MINOR__ 0 #define __GNUC_PATCHLEVEL__ 1 当您想知道GNU

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


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

\uuuu GNUC\uuuu
\uu GNUC\u MINOR\uuuu
\uu GNUC\u PATCHLEVEL\uuu

例如,GCC 4.0.1将执行以下操作:

#define __GNUC__ 4
#define __GNUC_MINOR__ 0
#define __GNUC_PATCHLEVEL__ 1
当您想知道GNU GCC编译器在当前编程环境下定义的预处理器指令是什么时,请记住下面的一个小命令行:

gcc-E-dM- 从:

__GNUC_uuuuu
__小调 __GNUC_补丁级别_u_
这些宏是由使用C预处理器的所有GNU编译器定义的:C、C++、ObjtoFe C和FORTRAN。它们的值是编译器的主版本、次版本和修补程序级别(作为整数常量)。例如,GCC 3.2.1将定义_GNUC__至3、_GNUC_次要__至2以及_GNUC_PATCHLEVEL__至1。如果直接调用预处理器,也会定义这些宏

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


从gnu cpp手册


这些宏是由使用C预处理器的所有GNU编译器定义的:C、C++、Objto-C和FORTRAN。它们的值是编译器的主版本、次版本和修补程序级别(作为整数常量)。例如,GCC 3.2.1将

定义为3、
定义为2、
定义为1。如果直接调用预处理器,也会定义这些宏

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

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

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

gcc版本有3个宏可供测试

__GNUC_MINOR__ 
 __GNUC_PATCHLEVEL__ 
 __GNUC__ 
e、 g.我的gcc第4.3.1版将其定义为:

#define __GNUC_MINOR__ 1
#define __GNUC_PATCHLEVEL__ 3
#define __GNUC__ 4
您可以看到通过运行

gcc-E-dM-xc/dev/null


GCC预定义预处理器指令的好技巧。排序时效果更好:
gcc-E-dM-
感谢您的提示--运行
gcc-E-dM-
非常有用!您将如何在Windows上生成它们?可能的重复,通用C/C++是我还是clang定义了相同的?那么这不是对gcc的真正测试吗?
#define __GNUC_MINOR__ 1
#define __GNUC_PATCHLEVEL__ 3
#define __GNUC__ 4