C/C++的标准演进及对应的编译器

C++ 标准

ISO - ISO/IEC 14882:1998 - Programming languages — C++

WG21是C++标准委员会,ISO/IEC JTC1/SC22/WG21 - The C++ Standards Committee - ISOCPP

名称C++标准年份
C++98ISO/IEC 14882:19981998
C++03ISO/IEC 14882:20032003
C++11ISO/IEC 14882:20112011
C++14ISO/IEC 14882:20142014
C++17ISO/IEC 14882:20172017
C++20ISO/IEC 14882:20202020
C++23下一代2023

C++98/C++03标准

1998年制定出的第一个C++标准ISO/IEC 14882:1998。通常被称为C++98,它不仅描述了已有的C++特性,还对该语言进行了扩展,添加了异常、运行阶段识别符(RTTI)、模板和标准模板库(STL)。2003年,发布了第二个C++标准ISO/IEC 14882:2003。这个版本的是一次技术性修正,对第一版进行了整理、修订错误、减少多义性等,但是没有改变语言特性。这个版本通常被称为C++03。由于没有改变语言特性,一般用C++98表示C++98/C++03。

C++11标准

ISO标准委员会在2001年8月批准了新的标准C++11 ISO/IEC 14882:2011。C++11在C++98的基础上增加了许多新特性。其目标是消除不一致性,让C++学习和使用更加容易。

C++ 11是什么,C++ 11标准的由来

C++14标准

C++标准第四版,2014年8月18日发布。正式名称为ISO/IEC 14882:2014 。2014年8月18日,ISO组织在其网站上发布文章称:“C++ 作者 Bjarne Stroustrup 称,主要的编译器开发商已经实现了 C++ 14 规格”。C++ 14 是 C++ 11 的增量更新,主要是支持普通函数的返回类型推演,泛型 lambda,扩展的 lambda 捕获,对 constexpr 函数限制的修订,constexpr变量模板化等等。C++14是C++语言的最新标准,正式名称为"International Standard ISO/IEC 14882:2014(E) Programming Language C++"。C++14旨在作为C++11的一个小扩展,主要提供漏洞修复和小的改进。C++14标准的委员会草案(Committee Draft)N3690于2013年5月15日发表。工作草案(Working Draft)N3936已于2014年3月02日完成。最终的投票期结束于2014年8月15日,结果(一致通过)已于8月18日公布。

C++17标准

C++17 是继 C++14 之后,C++ 编程语言 ISO/IEC 标准的下一次修订的非正式名称。在2017年10月,ISO C++ 委员会正式发布了 C++ 17 标准,官方名称为 ISO/IEC 14882:2017。基于 C++ 11,C++ 17 旨在使 C++ 成为一个不那么臃肿复杂的编程语言,以简化该语言的日常使用,使开发者可以更简单地编写和维护代码。

C++20标准

ISO C++委员会在2020年12月正式发布了 C++20 标准,命名为 ISO/IEC 14882:2020。C++ 之父 Bjarne Stroustrup 表示:“C++ 20是自C++11以来最大的发行版,它将是C++发展史上的里程碑。” c++20引入了更多特性,以更简单地编写和维护代码。

C++23标准

下一代开发中的标准。

GCC版本对C++的支持情况

C++版本

GCC版本支持情况GCC版本指定版本的命令标志
C++98完全支持是GCC 6.1之前版本的默认模式 -std=c++98 or -std=gnu++98
C++11完全支持从GCC4.8.1版本开始完全支持-std=c++11 or -std=gnu++11
C++14完全支持 从GCC 6.1版本开始完全支持,是GCC 6.1到GCC 10 (包括) 的默认模式-std=c++14 or -std=gnu++14
C++17完全支持从GCC 5版本开始,到GCC 7版本,已基本完全支持。 是GCC 11版本的默认模式-std=c++17 or -std=gnu++17
C++20未完全支持从GCC 8版本开始陆续支持C++20特性-std=c++20 or -std=gnu++20(GCC9及以前使用-std=c++2a)
C++23未完全支持(标准还在发展中) 从GCC 11版本开始支持C++23特性-std=c++2b or -std=gnu++2b

C语言标准,ANSI C,ISO C,GNU C

丹尼斯·里奇(Dennis Ritchie)于1969年在 AT&T 贝尔实验室编写 Unix 操作系统,实现该系统的程序语言就是 C 语言,因此里奇是 C 语言之父与 UNIX 之父,后面的 Linux、Window、MAC OS 都是基于 UNIX 进行开发的。

1、 K&R C标准

1978年,布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)出版了《The C Programming Language》这本书,作为C语言的非正式标准,称为K&R标准。

该标准对前期的C语法做了些改进,比如:把运算符“=+“和”=-“,改为”+=“和”-=“,避免赋值运算int i = -10与算术运算i =- 10产生混淆。

但是与现在的标准C存在很大的差异,比如:1、函数定义可省略返回类型:function(){};2、函数参数先列出形参的标识符,然后在函数声明的后面紧跟着对形参标识符的完整声明,最后是函数体:void function(a,b)int a;int b;{}。这些用法在现行的标准中已经被弃用了。

2、 ANSI C标准

当时的PC制造上IBM和Microsoft都在使用C语言,因此,美国国家标准协会ANSI(American National Standards Institute)制定了第一个 C 标准,在1989年被正式采用,官方名称为(American National Standard X3.159-1989),也称为(ANSI X3.159-1989),简称为 C89,也称为 ANSI C。

3、 ISO C标准

在1990年,ANSI C标准作了一些改进,被国际标准化组织 ISO( International Organization for Standardization)采纳,官方名称为ISO/IEC 9899:1990, 简称为称为ISO C,也称为C90。因为区别很小,因此,C89和C90通常指同一种语言,与传统C语言K&R标准对比, ANSI/ISO标准C语言的改进了很多。

4、 C95标准

在1995年,对C89标准作了一个修订与补充,产生了一个C95标准,官方名称为:ISO/IEC 9899:1990/AMD 1:1995,但并不是一个真正的标准,主要改动如下,

5、 C99标准

在1999年,C语言的标准化委员会将不断改进的C语言, 收纳为新的标准,官方名称为 ISO/IEC 9899: 1999,简称为 C99 标准,严格上讲是C语言的第二个官方版本,C99 标准引入了许多特性。

6、 C11标准

2011年,C语言标准委员会又重新开始将之前几年修订的C语言进行收纳,制定为新的标准,官方名称为ISO/IEC 9899: 2011,简称C11,是C语言的第三个官方版本,该版本作了如下改进:

7、 C17标准

在2018年,C语言标准委员会又重新制定为新的标准,官方名称为ISO/IEC 9899:2018,简称C17(也被称为为 C18),该版本对C11进行了补充和修正。

8、 下一个标准

下一个标准还在起草制定阶段,官方名称为ISO/IEC WD 9899,什么时候完成未定。各个标准的制定里程碑如下图所示:

各个版本的详细名称如下表所示,可参考官方网站下载标准文档: 

Project status and milestones

其中ANSI/ISO/IEC是三个标准制定化组织,

9、 GNU C标准

在1983年,理查德·马修·斯托曼(Richard Matthew Stallman, RMS),自由软件运动的精神领袖、GNU计划以及自由软件基金会(Free Software Foundation)的创立者、著名黑客,在其领导下,创立了GNU C标准,该标准应用于Linux操作系统,但是Linux操作系统也支持标准C;因此标准C是跨平台的,在Window和Linux下均支持,GNU C标准一般在Linux下使用。Linux 上可用的 C 编译器是 GCC 编译器,GCC编译器默认支持GNU C标准,同时也支持标准C,可以根据编译选项决定使用哪个C标准进行编译:

“c90标准: -std=c90,C99标准: -std=c99,C11标准: -std=c11”。

使用c99标准编译.c文件的命令行如下:

gcc -std=c99 main.c -o main.exe

GNU标准对标准C进行了一系列的扩展,以增强标准的功能,如下所示的区别:

(1).GNU C标准支持零长度和变量长度数组;

(2).case范围:GNU C支持case x...y这样的语法,区间[x,y]中的数都会满足这个case的条件; 

(3).语句表达式:GNU C把包含在括号中的复合语句看成是一个表达式,称为语句表达式,它可以出现在任何允许表达式的地方。可以在语句表达式中使用原本只能在复合语句中使用的循环、局部变量等。 

(4).typeof关键字:typeof(x)语句可以获取x的类型,因此,可以使用typeof重新定义min这个宏。 

(5).可变参数宏 

(6).标号元素:ANSI C标准中,要求数组或结构体的初始化值必须以固定的顺序出现。但是,在GNU C中通过指定索引或结构体成员名,允许初始化值以任意顺序出现。指定数组索引的方法是在初始化值前添加"[INDEX] =",也可以使用"[FIRST...LAST] ="的格式指定一个范围。

(7).当前函数名:GNU C预定义了两个标识符保存当前函数的名字,__FUNCTION__即函数在源代码中的名字。__PRETTY_FUNCTION__保存带有语言特色的名字,C99已经支持__func__宏,因此建议在Linux编程中不再使用__FUNCTION__,而转而使用__func__。

(8).特殊属性声明:GNU C标准允许声明函数、变量和类型的特殊属性,以便于手动优化代码和定制代码检查的方法。要指定一个声明的属性,只需要在声明后添加__attribute__(ATTRIBUTE)。其中,ATTRIBUTE为属性说明,如果存在多个属性,则以逗号分隔开。

GNU C支持noreturn、format、p、aligned、packed等十多个属性。

 (9).内建函数:GNU C标准中提供了大量内建函数

 

Have Fun

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值