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 / Standards
https://sourceforge.net/p/predef/wiki/Standards/
本文介绍了C/C++编程语言的不同版本,如C99、C++11等,并通过预定义宏如__STDC__和__STDC_VERSION__来确定编译器所遵循的标准。在Ubuntu环境下,使用gcc/g++编译器的例子展示了如何查看当前编译器支持的C/C++版本。文章总结了如何根据__STDC__和__cplusplus宏的值来判断语言类型及版本。
7877

被折叠的 条评论
为什么被折叠?



