【在主画面加入捷径】
       
【选择语系】
繁中 简中

[C 语言] 程序设计教学:C 语言标准的演进

【赞助商连结】

    C 语言是一个超过 40 岁的程序语言,但并非停滞不前,而经过了数个版本的演进:

    • K&R C
    • ANSI C (或 C89)
    • C99
    • C11
    • C17 (或 C18)

    由于 C 语言是嵌入式系统中常用的工具,另外定义出以下标准:

    • Embedded C

    这套标准加入了一些嵌入式系统适用的特性,一开始学 C 语言时不用急着学这套标准。

    在类 Unix 系统上,还有一个值得注意的标准:

    • POSIX

    虽然 POSIX 严格来说不是 C 标准,但类 Unix 系统是除了 Windows 家族外现行操作系统中最普遍的。如果项目不需发布在 Windows 上而要在类 Unix 系统上,可以看一下这套标准提供的 C API。

    了解 C 标准的用意在于了解每个标准可用的语法特性,有助于选择适合自己的 C 编译器。如果读者还没学 C 语言,对于一些细节尚不了解,可先大略看一下,之后再回头阅读。

    K&R C

    这个版本是早期 C 还没标准化时,所出现的非正式标准,来自于 Brian Kernighan and Dennis Ritchie 于 1978 年所着的 The C Programming Language ,这本书的第二版补足了 ANSI C 的部分。

    包括以下项目:

    • 标准化的 I/O函数库
    • long int 类型
    • unsigned int 类型
    • 修改复合指派 (compound assignment) 运算符的撰写方式

    由于 K&R C 和现行的 C 语法有一些差异,除了知道有这个标准外,不用刻意去学习。

    ANSI C

    注:也称为 C89。

    第一个 C 语言的国际标准 (ISO standard),大部分 C 语言的学习者和教材所认定的 C 语言就是指这个版本,甚至有些 C 程序设计师仍坚守着这个版本的 C;一个实例就是 Lua 官方直译器强调他们的 Lua 实现根随着 ANSI C 的标准,因此有着最佳的可携性 (portability)。C89 后还有一些较小的更新,像是 C95,但这些后续的更新在 C 语言特性上没有显着改变。

    正式的 C 标准文件需付费购买,在网络上散布这些文件是犯法的,因此,一般在网络上查得到的 C 标准文件多为非正式版本 (draft),像是这里,后续各版本亦同。

    C99

    继 C89 后第一个重大的版本更新,包括但不限于以下项目:

    • 单行注解 // ...
    • 内联函式 (inline function)
    • 复数 (complex number)
    • 加强对浮点数的支援
    • 布尔值 (boolean) 等数个新类型
    • 泛用类型 (type-generic)函数,这是一些关于数学运算的宏
    • 可在 for 循环开头声明变量

    C11

    另一个重大的版本更新,包括但不限于以下项目:

    • 泛用类型函式 (type-generic expression)
    • 多线程支援
    • 改善对万国码 (unicode) 的支援
    • 匿名结构

    现代 C 语言就是指 C11 之后的 C 语言。由于 C11 已经问世多年,大部分主流 C 编译器都已经实现了这个标准,除了有维护旧项目的考量外,应可放心地在项目中使用这个标准。

    C17

    C17 则是对 C11 的一些改善,主要的目标为修复 C11 的一些 bug,没有引入新的语法特性。

    注:不要将 C17 和 C++17 搞混,前者是 C 标准,后者则是 C++ 标准。

    POSIX

    POSIX (Portable Operating System Interface) 本身不是 C 语言标准,而是类 Unix 系统的标准,该标准规范有关殻程序 (shell)、命令行工具、一些 C函数库等项目。对于 C 语言来说,POSIX 标准提供了一些除了 C 标准函式库以外的 API。Windows 家族系统没有遵守 POSIX 标准,但目前市面上知名的系统,包括 Mac OS、GNU/Linux、BSD 系统等,大抵上都是 POSIX 兼容的,所以 POSIX 仍然值得注意。

    各个 C 编译器对 C 标准的支援

    常见的 C 编译器中,GCCClang 对 C 标准支援较好,支援 C89、C99 和一部分的 C11,而 Visual C++ 仅支援 C89 和一部分的 C99。这些讯息可能会随时间改变,最好的方式是自行查阅各编译器的官方手册。

    本系列文的方向

    我们会合理地使用新的语言特性,但会附注这些特性是在那个时期的 C 标准中。我们的目标编译器会以 GCC 为优先考量,因 GCC 在类 Unix 系统上相当容易取得,甚至在 Windows 家族系统上也可以透过 MinGW 取得 GCC 的移植品;而 Visual C++ 对 C 语言的支援相对落后,没有必要死守在旧有的标准中。

    现代语言在发展时,大抵上也一并发展相关的工具;但 C 语言的开发工具会因系统而异,因此,我们会分 Windows、Mac、GNU/Linux 等系统来讨论 C 相关的工具。

    TAGS: C 语言