zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C++实操 - 如何判断是使用C还是C++编译器以及编译器版本

C++编译器 如何 版本 以及 判断 还是 实操
2023-09-11 14:22:08 时间

C/C++的语言标准有不同的版本,比如C99,C++11。

我们在使用C/C++编程时,一般其实是默认在某个标准版本下进行,只不过新版标准向后兼容,所以通常我们用新编译器编译老代码一般没问题。

根据选用的编译器和编译器的版本,决定了编译器是按照那个标准来编译我们的代码。

如果你使用新标准的语言特性,确实用旧版本编译器来编译,肯定会编译出错。

C/C++标准里同样规定了一些标准本身的信息,通过预定义宏来获得。

在我们的代码里,我们可以使用这些预定义宏。

下面是C/C++标准定义的一些语言标准本身相关的信息:

Name

Macro

Standard

C89

__STDC__

ANSI X3.159-1989

C90

__STDC__

ISO/IEC 9899:1990

C94

__STDC_VERSION__ = 199409L

ISO/IEC 9899-1:1994

C99

__STDC_VERSION__ = 199901L

ISO/IEC 9899:1999

C11

__STDC_VERSION__ = 201112L

ISO/IEC 9899:2011

C18

__STDC_VERSION__ = 201710L

ISO/IEC 9899:2018

C++98

__cplusplus = 199711L

ISO/IEC 14882:1998

C++11

__cplusplus = 201103L

ISO/IEC 14882:2011

C++14

__cplusplus = 201402L

ISO/IEC 14882:2014

C++17

__cplusplus = 201703L

ISO/IEC 14882:2017

我们使用我的Ubuntu里面的gcc/g++来试一下:

test.c

#include <stdio.h>



int main()

{

  printf("STDC: %d.\n", __STDC__);

  printf("Ver:%ld.\n", __STDC_VERSION__);

  return 0;

}



$ gcc -o test test.c

$ ./test

STDC: 1.

Ver:201710.

我们看到__STDC__这个宏被定义且值为1,而__STDC_VERSION__这个值表示C18标准。

test.cpp



#include <cstdio>



int main()

{

  printf("STDC: %d.\n", __STDC__);

  printf("Ver:%ld.\n", __cplusplus);

  return 0;

}



$ g++ -o test test.cpp

$ ./test

STDC: 1.

Ver:201402.

我们看到__STDC__这个宏被定义且值为1,而__cplusplus这个宏表示是C++14版本。

总结:

1,如果定义了__STDC__,那就是C或C++程序。此时,如果定义了__cplusplus,就表示C++,否则是C。

2,C语言的话编译器使用的版本用__STDC_VERSION__的值来判断。

3,C++语言的话,编译器使用的版本用__cplusplus的值来判断。

参考:

Pre-defined Compiler Macros / Wiki / Standardsicon-default.png?t=L9C2https://sourceforge.net/p/predef/wiki/Standards/