器→工具, 编程语言

C语言学习之C语言版本

钱魏Way · · 14 次浏览

C语言的版本

C语言有多个版本,这些版本反映了其语言规范的演进。

下面是一些主要的C语言版本:

  • K&R C:这是最初的C语言版本,由Dennis Ritchie和Brian Kernighan于1978年在他们的著作”The C Programming Language”中定义。
  • ANSI C/C89/C90:美国国家标准协会(ANSI)在1989年发布了一个新的C语言标准,被称为C89或ANSI C。这个标准在1990年被国际标准组织(ISO)采纳,因此也被称为C90。这个版本的C语言清晰地定义了语言的语法和库,并且得到了广泛的支持。
  • C95:这是一个小修订版,修复了一些C90的问题,添加了一些对国际字符集的支持。
  • C99:这是一个大的更新,添加了许多新特性,例如新的数据类型(长长整型,复数类型),内联函数,变长数组,以及一些新的库函数等。
  • C11:这个版本进一步增加了一些新特性,例如多线程支持,静态断言,匿名结构和联合,以及改进的Unicode支持等。
  • C18/C17:这是对C11的一个小修订,修复了一些C11的缺陷,但没有添加新的语言特性。
  • C2x:这是正在开发的下一个C语言版本,预期将添加一些新的特性和功能。

每个新版本的C语言都在前一个版本基础上进行了改进和增强,并尽量保持向后兼容性。

需要注意的是,虽然C语言的标准已经发布多个版本,但是仍然存在一些编译器只支持旧版标准的情况。因此,在进行C语言编程时,需要根据实际情况选择合适的标准,并使用相应的编译器。

C语言不同版本的区别

ANSI C/C89/C90与K&R C的区别

ANSI C(也被称为C89或C90)是对K&R C的一个主要升级。它引入了许多新特性,同时也清晰地定义了语言的语法和库,使其更加稳定,规范化,也更易于各种编译器的实现和移植。

以下是一些C89/C90相比K&R C的主要升级:

  • 函数原型:在K&R C中,函数没有原型,参数类型的检查是非常有限的。C89引入了函数原型的概念,使得编译器能够在编译时检查函数参数的数量和类型。
  • 更丰富的库支持:C89定义了一套丰富的标准库,包括对文件I/O,字符串操作,数学函数等的支持。
  • 类型定义的改进:C89引入了void类型,以及一些新的类型指示符,如signed和unsigned。
  • 宏定义的改进:C89支持带参数的宏,和#if预处理指令,使得宏的功能更加强大。
  • 更严格的类型检查:在K&R C中,许多类型的隐式转换是被允许的,而在C89中,这些隐式转换可能会引发警告或错误。
  • 标准化:C89是第一个被ANSI和ISO采纳的C语言标准,这使得不同厂商的C语言编译器能够提供一致的语言特性和行为。
  • 各种语言细节的改进和修正:C89对K&R C中的许多语言细节进行了改进和修正,例如对枚举的处理,对结构的赋值和比较等。

总的来说,C89/C90的目标是使C语言更加规范化,易于使用,易于实现和移植,以满足日益复杂的软件开发需求。

C95与ANSI C/C89/C90的区别

C95是对ANSI C/C89/C90的一个较小的修订,其主要的改进在于对于国际字符集的支持。

在C95中,ISO对C90进行了一些修订,最主要的是添加了对宽字符类型和相关函数库的支持,以便能够处理各种不同的字符集,包括Unicode。这是为了支持那些使用非ASCII字符集的语言环境。

因此,C95的主要改进在于:

  • 宽字符和多字节字符的支持:C95引入了宽字符类型(wchar_t)和一系列处理宽字符和多字节字符的库函数,例如wprintf,wscanf,wctomb,mbtowc等。
  • 包含了新的头文件:<iso646.h>,<wchar.h>,<wctype.h>这几个头文件被加入到了C95中,以支持以上提到的新特性。

除此之外,C95和C90在语言特性上是基本一致的。C95并没有引入新的语法特性或者对C90进行大的修改。

C99与C95的区别

C99是C语言的一个重要版本,它在C95的基础上引入了许多新的特性。以下是一些重要的改进:

  • 新的数据类型:C99添加了许多新的基本数据类型,如长长整型(long long int),复数类型(_Complex),布尔型(_Bool),以及可变长度数组。
  • 内联函数:C99提供了内联函数(inline functions)的支持,这可以帮助优化函数调用的性能。
  • 更灵活的代码结构:在C99中,变量声明可以出现在任何地方,不再需要在代码块的开始处。这使得代码的结构可以更加灵活。
  • 设计定制的数学函数:C99提供了更多的数学库函数,包括浮点数环境的控制和常用的特殊数学函数。
  • 严格的类型检查:C99增加了对类型转换的严格检查,以减少类型转换带来的错误。
  • 添加了一些新的头文件:C99引入了一些新的头文件,其中包括<stdbool.h>(提供布尔类型支持),<stdint.h>(定义了一组与机器无关的整数类型),<tgmath.h>(类型通用的数学宏)等。
  • 其他一些新特性:C99还添加了其他一些新特性,例如宏的改进,复杂声明的改进,对注释的处理等。

总的来说,C99相比于C95,提供了许多新的语言特性和功能,使得C语言可以更好地处理复杂的编程任务。

C11与C99的区别

C11是在C99基础上的一个重大更新,引入了一些新的特性和功能。以下是C11相对于C99的一些主要改进:

  • 多线程支持:C11引入了新的头文件<stdthreads.h>,提供了原生的多线程支持。这包括了线程的创建和控制,互斥,条件变量等。
  • 原子操作:C11引入了新的头文件<stdatomic.h>,提供了原子类型和对这些类型的原子操作,这能够在多线程环境中安全地操作数据。
  • 静态断言:C11引入了_Static_assert关键字,可以在编译时进行断言检查,这对于检查常量表达式的条件非常有用。
  • 统一的排序和查找函数:C11新增了通用的排序函数qsort_s和查找函数bsearch_s。
  • 匿名结构和匿名联合:C11支持匿名结构体和匿名联合体,这使得嵌套结构和联合的代码更简洁。
  • 类型通用的数学宏的改进:C11对C99中的类型通用的数学宏进行了一些修订,使其更加易用。
  • 对C语言标准库的改进:C11对C语言的标准库进行了改进,例如,为fopen函数添加了新的模式,能够更好地处理Unicode等。
  • 对安全问题的关注:C11添加了一些特性以增强程序的安全性,例如新增的边界检查函数,以及新增的一些函数来替换旧的可能引发安全问题的函数。
  • 对柔性数组成员的明确支持:C11明确支持在结构体中使用柔性数组成员,这在C99中只是一个”语言扩展”。

总的来说,C11在C99的基础上,进一步增强了C语言的功能,提升了编程的灵活性和安全性,特别是在多线程环境下的编程。

C18与C11的区别

C18(也被称为C17)是对C11的一个小修订,它主要是修复了C11标准中的一些问题,但并没有引入新的语言特性。这意味着,C11中所有的特性和功能在C18中仍然完全适用。

以下是C18相对于C11的一些主要改动:

  • 修复了C11标准中的一些缺陷:C18对C11标准进行了一些修改,修复了其中的一些问题。这些问题主要涉及到标准文本的一致性和清晰度,以及一些技术细节的处理。
  • 没有新的语言特性:C18并没有添加新的语言特性。也就是说,C11和C18在语言特性上是一致的。

所以,C18主要是对C11的维护更新,其目标是使C语言的标准更加一致、清晰,而不是引入新的语言特性。

C2x是什么?

C2x是C语言的一份新标准草案,C2x旨在解决现有C语言标准的一些问题,并引入一些新的特性和功能。

尽管C2x的最终内容还没有最终确定,但已经有一些提议的改动和新特性,这里列出一些可能的改动:

  • 边界检查接口:C2x可能引入对边界检查接口(Annex K)的修改或弃用,因为这套接口在实践中引发了一些争议和问题。
  • 更安全的函数:C2x可能引入一些更安全的函数来替换现有的可能导致缓冲区溢出等安全问题的函数。
  • 线程支持的改进:C2x可能包括对线程支持的改进,这可能包含一些新的线程创建和管理功能。
  • 新的运算符:C2x可能引入新的运算符,例如,用于检查整数溢出的运算符。

对一些功能的移除或弃用:C2x还可能移除或弃用一些现有的特性或功能,例如,gets函数,register关键字等。

以上是一些可能的改动,但最终的C2x标准可能会有所不同,具体的内容将取决于C语言标准委员会的决定。

C语言编译器与C语言版本

C语言有许多主流的编译器,其中最常用的包括GCC(GNU编译器集合),Clang(基于LLVM的编译器)和MSVC(微软的Visual C++编译器)。

以下是这些编译器默认支持的C版本:

  • GCC:最新的GCC(如GCC 11)默认支持C17(也被称作C18),并提供选项来支持C2x的某些特性。GCC也支持更早的C版本,包括C11、C99、C89/C90。
  • Clang:最新的Clang(如Clang 12)默认支持C17(也被称作C18),并提供选项来支持C2x的某些特性。同样,Clang也支持更早的C版本,包括C11、C99、C89/C90。
  • MSVC:微软的Visual C++编译器在C语言方面的支持一直比较弱,其默认只完全支持到C89/C90。从Visual Studio 2015开始,MSVC开始提供对C99的部分支持,但并不是全部特性。至于C11和C17的支持,MSVC只支持它们的一个子集。MSVC的主要关注点是C++语言的支持。

请注意,虽然这些编译器默认支持特定的C版本,但是你可以在编译时指定选项来选择使用不同的C版本。例如,在GCC和Clang中,你可以使用-std=c99,-std=c11,-std=c17等选项来选择使用C99,C11,C17等版本。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注