C++实操 - 如何判断是使用C还是C++编译器以及编译器版本
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/
相关文章
- C++ 读取 txt 文件件中某一行
- linux c++ 服务器端开发面试必看书籍
- C/C++端口复用SO_REUSEADDR(setsockopt参数)
- 基于c++11新标准开发一个支持多线程高并发的网络库
- 给图像添加椒盐噪声后用均值滤波和中值滤波过滤椒盐噪声的C++-OpenCV代码
- 06 C++ - 名字控制
- C++程序设计课程同步项目开发——前言
- C++静态成员和非静态成员的区别 及修饰
- 如何判断你的编译器是否支持c++11这个特性?
- 使用c++filt命令还原C++编译后的函数名
- C++中引用(&)的用法和应用实例
- md5算法 C++ 实现
- 《C++ 黑客编程揭秘与防范(第2版)》——6.5 破解基础知识及调试API函数的应用
- 基于 C++ C0 文法的简易编译器【100010116】
- C++编译器与链接器工作原理
- 揭秘:C++编译器的函数编译流程
- [第十届蓝桥杯省赛C++B组]年号字串
- 编译器是C写的,包括一点C++,editor和debugger是C++写的(最早的16位编译器是纯汇编写的)
- C++适配器模式
- C++ | 探究拷贝对象时的一些编译器优化
- 149、【动态规划】leetcode ——343. 整数拆分(C++版本)
- C++中的class (1)
- 分享一套C++入门基础视频
- C++编译器模板机制剖析
- 1C语言与C++语言的区别
- 蓝桥杯练习题三 - 纸牌三角形(c++)
- C/C++ 位运算符