前言
使用 C/C++ 实现功能的时候经常需要上网搜索一些解决方案,但是当你把代码粘贴到自己项目中时偶尔会出现编译失败的问题,其中一个原因就是新加的代码所使用的特性在当前的编译环境中并不支持,就好像不久前我们还在使用VS2003写着C++98标准的代码(2015年),虽然对C++11的特性垂涎已久,但是无奈在项目中就是无法使用,只能是遥望着它发飞快地发展出了C++14和C++17。
涉及到C/C++版本和标准的最常见的地方就是编译选项了,比如常见的 -std=c++11 就是使用C++11的标准编译,关于 C/C++ 各个版本标准的差异我们可能无法全部记住,但是一些主要的版本更替,还是很有必要了解一下的。
C语言版本更迭
| 年份 | C标准 | 通用名 | 别名 | 标准编译选项 | GNU扩展选项 |
|---|---|---|---|---|---|
| 1972 | Birth C | - | - | - | - |
| 1978 | K&R C | - | - | - | - |
| 1989-1990 | X3.159-1989, ISO/IEC 9899:1990 | C89 | C90, ANSI C, ISO C | -ansi, -std=c90, -std=iso9899:1990 |
-std=gnu90 |
| 1995 | ISO/IEC 9899/AMD1:1995 | AMD1 | C94, C95 | -std=iso9899:199409 |
- |
| 1999 | ISO/IEC 9899:1999 | C99 | - | -std=c99, -std=iso9899:1999 |
-std=gnu99 |
| 2011 | ISO/IEC 9899:2011 | C11 | - | -std=c11, -std=iso9899:2011 |
-std=gnu11 |
| 2018 | ISO/IEC 9899:2018 | C18 | - | -std=c18, -std=iso9899:2018 |
-std=gnu18 |
C++版本更迭
| 年份 | C++标准 | 通用名 | 别名 | 标准编译选项 | GNU扩展选项 |
|---|---|---|---|---|---|
| 1978 | C with Classes | - | - | - | - |
| 1998 | ISO/IEC 14882:1998 | C++98 | - | -std=c++98 |
-std=gnu++98 |
| 2003 | ISO/IEC 14882:2003 | C++03 | - | -std=c++03 |
-std=gnu++03 |
| 2011 | ISO/IEC 14882:2011 | C++11 | C++0x | std=c++11, std=c++0x |
std=gnu++11, std=gnu++0x |
| 2014 | ISO/IEC 14882:2014 | C++14 | C++1y | std=c++14, std=c++1y |
std=gnu++14, std=gnu++1y |
| 2017 | ISO/IEC 14882:2017 | C++17 | C++1z | std=c++17, std=c++1z |
std=gnu++17, std=gnu++1z |
| 2020 | to be determined | C++20 | C++2a | -std=c++2a |
std=gnu++2a |
号外
C/C++标准
- 看了C++的发展史才知道,原来从1978年Bjarne Stroustrup就开始了C++雏形的使用,直到20年后的1998年才确定了第一个C++标准
- C++11之前被称为C++0x,据说C++0x是C++11的草案,所以有些编译器使用C++11的编译参数是:-std=c++0x,后来使用:-std=c++11,但是据说不完全相同
- 关于C++20,协程的加入应该是一大惊喜了,值得期待!官方还表示,C++20 应该会是一个像 C++11 那样的大版本
gcc/g++
gcc发展到今天已经不单单可以编译C语言了,还可以编译C++、Java、Object-C等多种其他语言- 有一种说法是
GCC的全名是GNU Compiler Collection(GUN 编译器集合),而gcc是GCC中用于编译c语言的编译器 - 事实上,
gcc看起来并不像是一个编译器,而像一个调度器,针对于不同的文件调用不同编程语言的编译器 - 对于后缀为
*.c的文件,gcc把它当作是C语言程序源代码,而g++当作是C++程序源代码 - 对于后缀为
*.cpp的文件,gcc和g++都会当作是C++程序源代码 - 使用
g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL,所以再使用gcc编译C++程序是有时会报错 - 在用
gcc编译C++文件时,为了能够使用STL,需要加参数–lstdc++,但这并不代表gcc –lstdc++和g++等价 - 据说
g++会调用gcc,对于C++代码,因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接 - 需要注意的是,虽说
g++会调用gcc,对于*.c文件来说,编译出来的可执行文件也不一样,因为gcc会当成C语言程序编译,而g++调用的gcc会把它当做C++语言程序来编译,这或许就能解释为什么用g++就可以编译所有C/C++的程序,还要有gcc的存在(就我测试来看,同样的C语言代码,g++编译出来的程序体积要大一些)