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 / Standardshttps://sourceforge.net/p/predef/wiki/Standards/