C/C++发展历程和标准
1、C语言发展历程
C语言最初由 Dennis Ritchie 于 1969 年到 1973 年在 AT&T 贝尔实验室里开发出来,主要用于重新实现 Unix 操作系统。此时,C语言又被称为 K&R C。其中,K 表示 Kernighan 的首字母,而 R 则是 Ritchie 的首字母。
C语言一般分为GUN C 、ANSI C、标准C,在了解这几个术语对应的C标准之前,我们需要先了解三个组织,分别是自由软件基金会,美国国家标准学会以及国际标准化组织。下面对其三个组织进行简单说明:
- 自由软件基金会:是美国的一个民间非营利组织,致力于推进自由软件,其中linux与gnu就是由这个组织在维护。
- 美国国家标准学会:听名字就知道这是美国用于制定自己国家标准各类标准的组织(政府组织)
- 国际标准化组织:作用同美国国家标准协会相似,只是这个组织的目标更远大一些,致力于制定国际标准。
- 其中GNU C 是软件自由基金会制定的标准,ANSI C 是由美国国家标准学会制定的标准,而ISO C则是由国际标准化组织制定的标准,当前是一个国际化的时代,都在追求标准,那么这个标准化肯定不能是某一个国家的标准,那么这个标准肯定要有国际标准化组织来制定,所以我们常说的标准C其实就是ISO C,下面统称为标准C。
大约在90年代,美国国家标准学会与国际标准化组织相互接纳吸收对方的标准,所以当前标准C 与ANSI C的标准其实是一样的。GNU C 主要应用于linux开发,比标准C支持更多的特性,使用起来更加灵活,所以 标准C = ISO C = ANSI C ≠ GNU 。
2、C语言主要标准
2.1、C90 标准
由于C语言被各大公司所使用(包括当时处于鼎盛时期的 IBM PC),因此到了 1989 年,C语言由美国国家标准协会(ANSI)进行了标准化,此时C语言又被称为 ANSI C。
而仅过一年,ANSI C 就被国际标准化组织 ISO 给采纳了。此时,C语言在 ISO 中有了一个官方名称——ISO/IEC 9899: 1990。其中:
- 9899 是C语言在 ISO 标准中的代号,像 C++ 在 ISO 标准中的代号是 14882;
- 而冒号后面的 1990 表示当前修订好的版本是在 1990 年发布的。
对 于ISO/IEC 9899: 1990 的俗称或简称,有些地方称为 C89,有些地方称为 C90,或者 C89/90。不管怎么称呼,它们都指代这个最初的C语言国际标准。
这个版本的C语言标准作为 K&R C 的一个超集(即 K&R C 是此标准C的一个子集),把后来引入的许多非官方特性也一起整合了进去。其中包括了从 C++ 借鉴的函数原型(Function Prototypes),指向 void 的指针,对国际字符集以及本地语言环境的支持。在此标准中,尽管已经将函数定义的方式改为现在我们常用的那种方式,不过K&R C的语法形式仍然兼容。
2.2、C99标准
在随后的几年里,C语言的标准化委员会又不断地对C语言进行改进,到了 1999 年,正式发布了 ISO/IEC 9899: 1999,简称为 C99 标准。
C99 标准引入了许多特性,包括内联函数(inline functions)、可变长度的数组、灵活的数组成员(用于结构体)、复合字面量、指定成员的初始化器、对IEEE754浮点数的改进、支持不定参数个数的宏定义,在数据类型上还增加了 long long int 以及复数类型。
毫不夸张地说,即便到目前为止,很少有C语言编译器是完整支持 C99 的。像主流的 GCC 以及 Clang 编译器都能支持高达90%以上,而微软的 Visual Studio 2015 中的C编译器只能支持到 70% 左右。
2.3、C11标准
2007 年,C语言标准委员会又重新开始修订C语言,到了 2011 年正式发布了 ISO/IEC 9899: 2011,简称为 C11 标准。
C11标准新引入的特征尽管没 C99 相对 C90 引入的那么多,但是这些也都十分有用,比如:字节对齐说明符、泛型机制(generic selection)、对多线程的支持、静态断言、原子操作以及对 Unicode 的支持。
关于C语言历史与演化进程的详细介绍可参考维基百科:https://en.wikipedia.org/wiki/C_%28programming_language。
2.3、C语言标准一览表
C语言标准一览表如下所示。
时间 | 名称 | 标准制定组织 | 事件 |
1989 | ANSI C / C89 | ANSI | ANSI通过C语言标准 |
1990 | C90 | ISO & IEC | ISO&IEC将C89标准定为C语言国际标准 |
1994 | C94 | ISO & IEC | ISO&IEC发布C89标准修订版,即C94 |
1995 | C95 | ISO & IEC | ISO&IEC发布C94标准修订版,即C95 |
1999 | C99 | ISO & IEC | ISO&IEC发布C语言新标准,即C99。这是C语言第二个标准 |
2011 | C11 | ISO & IEC | ISO&IEC发布C语言新标准,即C11。这是C语言第三个标准 |
3、C标准库的实现
1)GNU/Linux版实现:glibc.so(注:Linux中被重命名为libc.so。原因:所有Linux库都必须以lib前缀打头)
2) Mac和iOS实现:
- Mac中,C标准库的实现是libSystem(/usr/lib/libSystem.dylib)的一部分;
- iOS可以使用 iOS SDK来访问标准库;
3)Windows版实现:
在Windows上,标准库的实现一直严格限定在 Visual Studio中,它是微软官方编译器。他们通常称之为C/C++运行时库(CRT),并且它涵盖了C/C++二者的实现。名为 CRTDLL.DLL。
从 Windows 95开始,Microsoft开始将其迁移到MSVCRT[版本号].DLL之上。例:MSVCR71.DLL
在1997年左右,他们决定将文件名简化为MSVCRT.DLL,这导致了 DLL混乱。因此从 Visual Studio 7.0开始,他们切换回每个版本使用单独的DLL了。
Visual Studio 2015引入了深度 CRT 重构。C/C++ 标准库的实现迁移到一个新库, Universal C运行时库(Universal CRT 或 UCRT),编译为 UCRTBASE.DLL。
4)Android版实现:
Bionic是Google为其Android操作系统所编写的C标准库实现,它直接在底层使用。第三方开发者可以通过Android NDK访问 Bionic,Android NDK允许开发者使用 C/C++代码编写Android应用程序。
4、C++语言发展历程
C++ 这门编程语言的历史可以追溯至 1979 年,当时的 Bjarne Stroustrup(C++ 之父,后续简称 Stroustrup)还在使用 Simula 语言进行开发工作。
Simula 语言被认为是第一个面向对象的编程语言。Stroustrup 也非常赞赏 Simula 语言的这种特性,但由于实例开发中 Simula 语言的执行效率太低,所以此后不久,Stroustrup 开始从事“带类的C”编程语言的开发工作。
1983 年,“带类的C”正式被称为“C++”,其中“++”就取自 C 语言中的“++”运算符,这也从侧面表明了 Stroustrup 对于 C++ 这门编程语言的定位。 与此同时,C++还增添了很多功能,比如虚函数、函数重载、引用、const 关键字以及 // 注释符号等。
在随后的几年时间里,C++ 得到了快速地发展。比如说, C++ 不断地被更新,类中增加了受保护成员(protected)和私有成员(private),并允许使用多继承等;Stroustrup 出版了 《带注释的C++参考手册》一书,其一度被当做 C++ 开发的重要参考;Borland 发布了 Turbo C ++编译器,该编译器包含有大量的第三方 C++ 库,极大便利了 C ++ 的开发,等等。
5、C++标准
5.1、C++主要标准
直到 1998 年,C++ 标准委员会发布了第一版 C++ 标准,并将其命名为 C++ 98 标准。据不知名人士透露,《带注释的C++参考手册》这本书对 C++ 98 标准的制定产生了很大的影响。
经过作者的不断迭代,一本书往往会先后发布很多个版本,其中每个新版本都是对前一个版本的修正和更新。C++ 编程语言的发展也是如此。截止到目前(2021年),C++ 的发展历经了以下 几个标准:
- 2011 年,新的 C++ 11 标准诞生,用于取代 C++ 98 标准。此标准还有一个别名,为“C++ 0x”;
- 2014 年,C++ 14 标准发布,该标准库对 C++ 11 标准库做了更优的修改和更新;
- 2017 年底,C++ 17 标准正式颁布;
- 2020年,C++20标准发布,C++ 之父 Bjarne Stroustrup 表示:“C++ 20是自C++11以来最大的发行版,它将是C++发展史上的里程碑。”
值得一提的是在 C++ 11 标准之前,C++ 标准委员会还在 2003 年对 C++ 98 标准做了一次修改(称为 C++ 03 标准),但由于其仅仅修复了一些 C++ 98 标准中存在的漏洞,并未修改核心语法,因此人们习惯将这次修订和 C++ 98 合称为 C++98/03 标准。
以上几个标准中,C++98、C++11和C++20是比较主要和重要的。
5.2、C++标准一览表
C++语言标准一览表如下所示。
时间 | 名称 | 标准制定组织 | 事件 |
1998 | C++ 98 标准 | ISO & IEC |
1998年C++标准得到ISO和ANSI批准。 以后每5年视实际需要更新一次。 |
2003 | C++ 03 标准 | ISO & IEC | 2003年通过了C++标准第二版。 |
2011 | C++ 11 标准 | ISO & IEC |
2011年发布了C++标准第四版C++ 11,取代现行的C++ 98 和 C++ 03。 此次标准为 C++ 98发布13年来第一次重大修正。 |
2014 | C++ 14 标准 | ISO & IEC |
2014年发布了C++标准第四版C++ 14, 是 C++ 11的增量更新。 |
2017 | C++ 17 标准 | ISO & IEC | 2017年发布,是基于 C++ 11对 C++ 语言的重大更新 |
2020 | C++ 20 标准 | ISO & IEC | 2020年发布,是自C++11以来最大的发行版 |
6、C++标准库的实现
1)GNU/Linux版实现:libstdc++
2)Mac和iOS实现:
Mac中,Mac OS < V10.9, libstdc++是默认选项;Mac OS >= V10.9,使用 libc++(注1:这是LLVM项目所引人的 GNU libstdc++ 的替代;注2:LLVM是Mac官方编译器框架)
iOS可以使用 iOS SDK来访问标准库;
3) Windows版实现:
在Windows上,标准库的实现一直严格限定在 Visual Studio中,它是微软官方编译器。他们通常称之为C/C++运行时库(CRT),并且它涵盖了C/C++二者的实现。名为 CRTDLL.DLL。
从 Windows 95开始,Microsoft开始将其迁移到MSVCRT[版本号].DLL之上。例:MSVCR71.DLL
在1997年左右,他们决定将文件名简化为MSVCRT.DLL,这导致了 DLL混乱。因此从 Visual Studio 7.0开始,他们切换回每个版本使用单独的DLL了。
Visual Studio 2015引入了深度 CRT 重构。C/C++ 标准库的实现迁移到一个新库, Universal C运行时库(Universal CRT 或 UCRT),编译为 UCRTBASE.DLL。
4)Android版实现:
对C++标准库,Android NDK提供了很多版本的实现:
- libc++。从 Lollipop 开始的官方安卓系统和现代 Mac OS 都将其作为 C++ 标准库使用。从NDK v17开始,它将成为NDK中唯一可用的 C++ 标准库实现。
- gnustl。libstdc++的别名,这两者在GNU/Linux中同一个库。该库已被弃用,它将在NDK v18中删除。
- STLport。由STLport项目编写的C++标准库的第三方实现,自2008年开始一直处于不活跃状态。与gnustl一样,STLport将在NDK v18种移除。
7、C与C++的关系
7.1、C++与C语言的区别
C语言是C++的基础,C++和C语言在很多方面是兼容的。
C语言是一个结构化语言,它的重点在于算法与数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事物)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制。所以C语言和C++的最大区别在于它们解决问题的思想方法不一样。
C++对C的“增强”,表现在六个方面:
- (1) 类型检查更为严格。
- (2) 增加了面向对象的机制。
- (3) 增加了泛型编程的机制(Template)。
- (4) 增加了异常处理。
- (5) 增加了运算符重载。
- (6) 增加了标准模板库(STL)。
7.2、C++与C不兼容之处
C++一般被认为是C的超集合(Superset),但这并不严谨。大部分的C代码可以很轻易的在C++中正确编译,但仍有少数差异,导致某些有效的C代码在C++中失效,或者在C++中有不同的行为。
- 最常见的差异之一是,C允许从void*隐式转换到其它的指针类型,但C++不允许。
- 另一个常见的可移植问题是,C++定义了新关键字,例如如new,class,它们在C程序中可以作为识别字(例:变量名)的。
- 在C标准(C99)中去除了一些不兼容之处,也支持了一些C++的特性,如//注解,以及在代码中混合声明。不过C99也纳入几个和C++冲突的新特性(如:可变长度数组、原生复数类型和复合逐字常数)。
若要混用C和C++的代码,则所有在C++中调用的C代码,必须放在 extern "C" { /* C代码 */ } 内。
C/C++发展历程和标准相关推荐
- 【ITSS】信息技术服务标准(ITSS)的介绍以及发展历程
信息技术服务标准(ITSS)介绍 ITSS是Information TechnologyService Standards的缩写,中文意思是信息技术服务标准,是在工业和信息化部.国家标准化委的领导和支 ...
- 百度PHP高级顾问惠新宸:PHP在百度的发展历程
惠新宸,百度PHP高级顾问,年二十有八,好追根究底,有不良嗜好, 幸性本善.乙酉年识互联网,丁亥年入雅虎,翌年入百度.虽性好安稳,然经变无数,唯常叹"人生,菠菜汤尔". 大家好,今 ...
- JavaScript异步调用的发展历程
同步与异步 通常,代码是由上而下依次执行的.如果有多个任务,就必须排队,前一个任务完成,后一个任务才能执行.这种连续的执行模式就叫做同步. a(); b(); c(); 复制代码 上面代码中,a.b. ...
- GPU的发展历程、未来趋势及研制实践
来源:文章转载自期刊<微纳电子与智能制造>, 作者:熊庭刚 摘要 凭借GPU强大的计算能力,超级计算机在数据处理.物理模拟.天气预测.现代制药.基因测序.先进制造.人工智能.密码分析等方面 ...
- 焦李成教授谈深度神经网络发展历程
来源:西电人工智能学院 摘要:焦李成教授谈深度神经网络发展历程 2018年11月18日下午,计算机科学与技术学部主任.人工智能学院焦李成教授在成都参加了由中国人工智能学会主办的人工智能大讲堂并做特邀报 ...
- 细说JavaScript异步函数发展历程
2019独角兽企业重金招聘Python工程师标准>>> < The Evolution of Asynchronous JavaScript >外文梳理了JavaScri ...
- 天翼云从业认证(2.1)云计算的定义、特点、背景和发展历程
背景和发展历程 但追溯云计算的历史,可以追溯到1956年,ChristopherStrachey发表了一篇有关于虚拟化的论文,因为正式提出虚拟化.虚拟化则是今天云计算基础架构的核心,是云计算发展的基础 ...
- JAVASCRIPT发展历程
JAVASCRIPT发展历程 诞生 JavaScript 因为互联网而生,紧跟着浏览器的出现而问世.回顾它的历史,就要从浏览器的历史讲起. 1990年底,欧洲核能研究组织(CERN)科学家 Tim B ...
- Spring简介-Spring发展历程
Spring发展历程 1997 年, IBM提出了EJB 的思想 1998 年,SUN制定开发标准规范 EJB1.0 1999 年,EJB1.1 发布 2001 年,EJB2.0 发布 2003 年, ...
最新文章
- 3dsmax 让物体变透明
- 云原生时代下,容器安全的“四个挑战”和“两个关键”
- ChartDirector Python创建建多层甘特图的代码
- php基本操作-echo
- 不用安装Oracle Client如何使用PLSQL Developer
- 第二十七期:德国工业4.0眼里“工业互联网”与“智能制造”
- 解决设置了display:none的元素,会先展示再隐藏
- ECMAScript 6新特性介绍
- spring或springmvc自动生成applicationcontext.xml或springmvc文件(此文转载和借鉴多篇文章)...
- stata15中文乱码_Stata15:一次性转码,解决中文乱码问题
- sqlite3 error: database is locked
- 【转载】mac读取ntfs硬盘方法
- 一年太久,只争朝夕——2018年终总结
- [4G5G基础学习]:L3 RRC层概述与总体架构、ASN.1消息、无线承载SRB, DRB、终端三种状态、MIB, SIB,NAS消息类型
- 大厂技术博客学习(2)​——5G时代下淘宝直播高清低延时技术jie秘
- excel中区分移动联通电信号码
- A Game of Thrones(50)
- 语雀文章导入CSDN
- zool网关多个组件配置路由
- Linux 系统安装后优化项常见操作
热门文章
- java中的几种锁(很详细)-小白收藏
- Java线程阻塞和唤醒的几种方式
- 服务器虚拟内存不够,会导致出现什么情况
- 计算机小高考要点,“小高考”临近,4大技巧提高做题速度,拿下分数!
- 有没有一种定时便签软件可以每隔一段时间提醒我一次
- python汉诺塔的求解_Python汉诺塔算法解析
- 每日新闻丨未来数据中心的发展趋势;第三季中国可穿戴设备市场出货量2715万台...
- 【AI设计模式】05-检查点模式(CheckPoints):如何定期存储模型?
- MaxPool NMS Getting rid of NMS bottlenecks in Two-Stage Object Detectors
- linux终端stty恢复默认,linux stty命令