c语言标准的研究

总结各主要c标准之间的关系和C语言的知识点


C语言的历史

作为编程语言B的后继者,C 最初由 Dennis Ritchie与 Ken Thompson在 1972 年至 1973 年间在贝尔实验室开发,用于构建在 Unix 上运行的实用程序。它被应用于重新实现Unix操作系统的内核。20世纪80年代,C逐渐流行起来。它已成为使用最广泛的编程语言之一,其 C 编译器可用于几乎所有现代计算机体系结构和操作系统。

具体的历史

c标准历史

C89、ANSIC、C90

C语言的第一个标准是1989年完成的ANSI X3.159-1989 “Programming Language C”。称之为C89。由于这个标注由ANSI美国国家标准协会制定,所以又称之为ANSIC

在1990年,ANSI C标准(带有一些小改动)被国际标准化组织采纳为ISO/IEC 9899:1990,这个版本有时候称为C90因此,C89C90通常指同一种语言。

所以这三种标准实际上是同一种标准的不同叫法。

需要注意的是K&R C。1978 年,Brian Kernighan 和 Dennis Ritchie 出版了第一版《C 编程语言》。这本书以其作者名字的首字母缩写为 K&R,多年来一直作为该语言的非正式规范。它描述的 C 版本通常称为“K&R C”。由于该产品于 1978 年发布,因此也被称为 C78。本书的第二版涵盖了后来的ANSI C标准,如下所述。

所以K&R C其实并不是严格意义上的标准,虽然有很多人将其视为最初的C语言标准。

C99

在2000年三月,ANSI采纳了ISO/IEC 9899:1999标准。这个标准通常指C99。

C11

在2011年12月,ANSI采纳了ISO/IEC 9899:2011标准。这个标准通常即C11。

C17

C17 于 2018 年 6 月作为 ISO/IEC 9899:2018 发布,是 C 编程语言的当前标准。它没有引入新的语言功能,仅引入技术更正以及对 C11 中的缺陷的澄清。需要注意的是该标准也被称之为C18,这是因为它于2017年编写并于2018年6月发布。但是官方的称呼是C17而不是C18

C23

C23 是下一个(C17 之后)主要 C 语言标准修订版的非正式名称。预计将于 2024 年发布。

总结

通过以上的描述,我们可以知道c标准发展线:
K&R C(非正式标准)->C89(ANSI C C90)->C99->C11->C17(C18)->C23

自从C11以来与下一次的C标准之间的时间间隔都是6年。


具体的标准

C89

这一代的标准是第一次严格意义上的C标准,其是K&R C的超集。添加了:函数原型(借自 C++)、 void 指针、对国际字符集和语言环境的支持以及预处理器增强。尽管参数声明的语法得到了扩展以包括 C++ 中使用的样式,但为了与现有源代码兼容,K&R 接口仍然被允许。

C89中的关键字

c99

c99是1999年发布的C语言标准,所以称之为c99c99是在c89的基础上进行的改善。

关键字的变化

C99中的关键字

其引入了一些新的关键字:

  • 内联函数inline
  • 指针限定restrict
  • 布尔类型_Bool
  • 虚数类型_Imaginary
  • 复数类型_Complex

C11

关键字的变化

C11中的关键字

其中引入的新关键字:

  • _Alignas
  • _Alignof
  • _Atomic
  • _Generic
  • _Noreturn
  • _Starct_assert
  • _Thread_loacl

C17

关键字的变化

C17没有添加新的关键字。

本文记录一下C/C++标准版本,以及不同版本的新特性。其中:

  • C语言: C89/90、C95、C99、C11、C17

  • C++语言: C++98、C++03、C++11、C++14、C++17、C++20

1. 发行标准

1.1 C语言标准

  • C89 (ANSI X3.159-1989): 由美国国家标准协会(ANSI)于1989年发布的C语言标准,也被称作ANSI C。

  • C90 (ISO/IEC 9899:1990): 与C89基本相同,是C89在国际化上的延伸,由国际标准化组织(ISO)和国际电工委员会(IEC)于1990年采纳的C语言标准。

  • C95 (ISO/IEC 9899:1995): 是对ISO C90标准的一次修订,增加了一些新特性,例如支持多字节字符等。

  • C99 (ISO/IEC 9899:1999): 由ISO/IEC在1999年采纳的新版C语言标准,新增了一些特性,如内联函数、边长数组、严格类型别名、具名结构初始化等。

  • C11 (ISO/IEC 9899:2011): 由ISO/IEC于2011年发布的C语言标准,增加了更多的新特性,例如静态断言、通用结构初始器、匿名结构和联合等。

  • C17 (ISO/IEC 9899:2018): 于2018年发布的当前最新的C语言标准,主要修复了C11标准中的一些问题,没有引入新特性。

1.2 C++语言标准

  • C++98: 于1998年发布的C标准,是最早的国际标准化版本,包含了面向对象编程、模板等基本特性。

  • C++03: 于2003年发布,对C++98进行一些小修小补,主要是修复C++98的一些bug和漏洞。

  • C++11: 于2011年发布,被视为现代C++的开始,引入了多个重要特性,如自动类型推导、基于范围的 for 循环、Lambda 表达式、智能指针等。

  • C++14: 于2014年发布的C++标准,以更大的灵活性和性能优化为目标,引入了多个新特性,进行了增量式改进,例如泛型Lambda表达式、返回类型后置等。

  • C++17: 于2017年发布,进一步完善C++特性,如结构化绑定、并行算法库、内联变量等。

  • C++20: 最新的C标准,已经获得批准,编译器也已经开始支持其中的新特性。它引入了模块、概念、协程等重要特性 ,对C++语言进行了较大的扩展。

这些标准制定了C语言和C++的基本规范,各个编译器需要支持这些标准以确保代码的正确执行和相互兼容。在实际编程过程中,需要根据所使用编译器的支持情况选择合适的标准。

2. 版本新特性

2.1 C语言版本新特性

  1. C89/90
  • 函数原型

  • const 限定符

  • volatile 限定符

  • enum 枚举类型

  • void 指针类型

  • 单行注释,使用 //

  1. C99
  • 可变长度数组(VLA)

  • 行内函数 (inline)

  • 类型宽度宏,如 UINT32_MAX

  • 严格的类型别名规则(strict aliasing)

  • 灵活的数组成员 (Flexible Array Member)

  • 复合文字 (Compound Literals)

  • 布尔数据类型 _Bool

  • 复数和虚数数据类型

  1. C11
  • 多线程支持

  • 原子操作

  • 静态断言(Static assertions)

  • 无类型泛型宏(Generic selection)

  • 匿名结构和匿名联合

  • 外部变量的对齐声明

  • 类型泛化表达式

2.2 C++语言特性

1) C++98

  • 命名空间(namespaces)

  • 类模板(class templates)

  • 异常处理(exceptions)

  • 运行时类型识别(RTTI)

  • 标准模板库(STL)

  • bool 类型

  • 类型转换操作符

2) C++03

在C++98基础上修复了一些bug和漏洞

3) C++11

  • 自动类型推导(auto)

  • 基于范围的 for 循环(Range-based for loops)

  • Lambda 表达式

  • 右值引用和移动语义(Rvalue references and move semantics)

  • 初始化列表(Initializer lists)

  • 类型推断 decltype

  • constexpr 编译时计算

  • 强类型枚举(Scoped enumerations)

  • nullptr为NULL的替代品

  • 智能指针(shared_ptr, unique_ptr, weak_ptr)

  • 并发编程(包括多线程的支持)

4) C++14

  • 泛型Lambda表达式

  • 返回类型后置(函数返回类型推导)

  • 二进制字面值

  • 编译时整数序列(整数常量模板)

  • 引入传递引用类型的函数

  • 引入类型deprecated属性 (废弃声明)

5) C++17

  • 结构化绑定(Structured bindings)

  • 并行算法库(Parallel algorithms)

  • 内联变量(Inline variables)

  • 文件系统库(Filesystem library)

  • 变体类型(std::variant)

  • 可选类型(std::optional)

  • 任务型未来(std::future)

  1. C++20
  • 概念(Concepts)

  • 范围(Ranges)

  • 协程(Coroutines)

  • 模块(Modules)

  • 连续表述(constexpr features)

  • Lambda 表达式的优化

  • std::span 视图经常使用的一段连续内存

  • std::format 格式库

[参看]:

  1. cpluscpus reference

  2. cppreference

  3. C/C++标准版本及不同版本的新特性

  4. 深入剖析C++ 11新特性

  5. cpp_new_feature

  6. c++ shell


c语言标准的研究
https://ysc2.github.io/ysc2.github.io/2023/12/29/c22、c11、c99之间的研究/
作者
Ysc
发布于
2023年12月29日
许可协议