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++中有不同的行为。

  1. 最常见的差异之一是,C允许从void*隐式转换到其它的指针类型,但C++不允许。
  2. 另一个常见的可移植问题是,C++定义了新关键字,例如如new,class,它们在C程序中可以作为识别字(例:变量名)的。
  3. 在C标准(C99)中去除了一些不兼容之处,也支持了一些C++的特性,如//注解,以及在代码中混合声明。不过C99也纳入几个和C++冲突的新特性(如:可变长度数组、原生复数类型和复合逐字常数)。

       若要混用C和C++的代码,则所有在C++中调用的C代码,必须放在 extern "C" { /* C代码 */ } 内。

你可能感兴趣的:(C/C++,c,c++)