如何在C语言中用宏来判断当前编译器?

Python013

如何在C语言中用宏来判断当前编译器?,第1张

1、_MSC_VER 是微软C/C++编译器——cl.exe 编译代码时预定义的一个宏。需

要针对cl 编写代码时, 可以使用该宏进行条件编译。

2、_MSC_VER 的值表示cl 的版本。需要针对cl 特定版本编写代码时, 也可以使用

该宏进行条件编译。

3、_MSC_VER 的类型是"int",具体版本号定义如下:

MS VC++ 9.0 _MSC_VER = 1500

MS VC++ 8.0 _MSC_VER = 1400

MS VC++ 7.1 _MSC_VER = 1310

MS VC++ 7.0 _MSC_VER = 1300

MS VC++ 6.0 _MSC_VER = 1200

MS VC++ 5.0 _MSC_VER = 1100

其中MS VC++ 9.0 就是Visual C++ 2008,MS VC++ 8.0 就是Visual C++2005。

二、介绍预定义宏“__GNUC__”

1、__GNUC__ 是gcc 编译器编译代码时预定义的一个宏。需要针对gcc 编写代码时,

可以使用该宏进行条件编译。

2、__GNUC__ 的值表示gcc 的版本。需要针对gcc 特定版本编写代码时,也可以使

用该宏进行条件编译。

3、__GNUC__ 的类型是“int”

三、预定义宏"__MINGW32__"

1、MinGW编译器

四、symbian sdk 预定义宏:

symbian 平台,定义"__SYMBIAN32_"

3rd MR 版及之前的那个3rd 版本,定义"__SERIES60_30__"

3rd FP1 版,定义"__SERIES60_31__"

3rd FP2 版,定义"__SERIES60_32__"

另外,还有一个"__SERIES60_3x__"。若不需区分具体是哪一个3rd 版,则用之。

#define DIVIDEDBY3(m) (m)%3==0

#include <stdio.h>

int main()

{

    int m

    printf("enter a integer:\n")

    scanf("%d",&m)

    if(DIVIDEDBY3(m))

        printf("%d is divided by 3\n",m)

    else

        printf("%d is not divided by 3\n",m)

    return 0

}

不同编译器有不同的宏,具体某个编译器在某种编译选项下定义了哪些宏必须要查编译器的相关文档

例如,GCC 编译器对应的预定义宏是 __GNUC__,用

#if __GNUC__

即可判断是否在使用 GCC 编译器。__GNUC__ 的具体值对应GCC的主版本号。例如 对于GCC 4.9 ,__GNUC__ 等于 4,对于 GCC 5.1 ,__GNUC__ 等于 5,次版本号可以通过 __GNUC_MINOR__ 查询。对于 GCC 4.9,__GNUC_MINOR__ 等于 9,对于GCC 5.1,__GNUC_MINOR__等于 1

VC 的编译器对应的预定义宏是 _MSC_VER,用

#if _MSC_VER

即可判断是否在使用 VC 的编译器。_MSC_VER 的值同样以某种方式对应于编译器的版本,不过对应方式就复杂得多,再加上 VC 编译器的版本号以不规则的方式增长,所以找各种版本测试 _MSC_VER 的值恐怕更可靠

其他编译器也可能定义 __GNUC__ 或者 _MSC_VER 来表示自己兼容这些编译器,例如 clang 也定义了 __GNUC__ 。不过既然它声明了兼容性,除非测试确认了实际行为并不兼容,否则把它当成 GCC 也并无不可