天天看点

C/C++版本更迭历程前言C语言版本更迭C++版本更迭号外号外

文章目录

  • 前言
  • C语言版本更迭
  • C++版本更迭
  • 号外号外
    • C/C++标准
    • gcc/g++

前言

使用

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++标准

  1. 看了

    C++

    的发展史才知道,原来从1978年Bjarne Stroustrup就开始了

    C++

    雏形的使用,直到20年后的1998年才确定了第一个

    C++

    标准

    2.

    C++11

    之前被称为

    C++0x

    ,据说

    C++0x

    C++11

    的草案,所以有些编译器使用

    C++11

    的编译参数是:

    -std=c++0x

    ,后来使用:

    -std=c++11

    ,但是据说不完全相同
  2. 关于

    C++20

    ,协程的加入应该是一大惊喜了,值得期待!官方还表示,

    C++20

    应该会是一个像

    C++11

    那样的大版本

gcc/g++

  1. gcc

    发展到今天已经不单单可以编译

    C

    语言了,还可以编译

    C++

    Java

    Object-C

    等多种其他语言
  2. 有一种说法是

    GCC

    的全名是GNU Compiler Collection(GUN 编译器集合),而

    gcc

    GCC

    中用于编译c语言的编译器
  3. 事实上,

    gcc

    看起来并不像是一个编译器,而像一个调度器,针对于不同的文件调用不同编程语言的编译器
  4. 对于后缀为

    *.c

    的文件,

    gcc

    把它当作是

    C

    语言程序源代码,而g++当作是C++程序源代码
  5. 对于后缀为

    *.cpp

    的文件,

    gcc

    g++

    都会当作是C++程序源代码
  6. 使用

    g++

    编译文件时,g++会自动链接标准库

    STL

    ,而

    gcc

    不会自动链接

    STL

    ,所以再使用

    gcc

    编译

    C++

    程序是有时会报错
  7. 在用

    gcc

    编译

    C++

    文件时,为了能够使用

    STL

    ,需要加参数

    –lstdc++

    ,但这并不代表

    gcc –lstdc++

    g++

    等价
  8. 据说

    g++

    会调用

    gcc

    ,对于

    C++

    代码,因为

    gcc

    命令不能自动和

    C++

    程序使用的库联接,所以通常用

    g++

    来完成链接
  9. 需要注意的是,虽说

    g++

    会调用

    gcc

    ,对于

    *.c

    文件来说,编译出来的可执行文件也不一样,因为

    gcc

    会当成

    C

    语言程序编译,而

    g++

    调用的

    gcc

    会把它当做

    C++

    语言程序来编译,这或许就能解释为什么用

    g++

    就可以编译所有

    C/C++

    的程序,还要有

    gcc

    的存在(就我测试来看,同样的

    C

    语言代码,

    g++

    编译出来的程序体积要大一些)