Non-Profit, International

Spirit unsterblich.

C++ 已经取代 C

字数统计:910 blog

本文是我在知乎上的回答的拷贝,指出 C 和 C++ 的发展不是孤立的,C 89 在事实上采纳了 C++ 方言而取代了原本的 K&R 方言,并且未来的 C 标准也一直从 C++ 中吸收新特性,因此 C++ 实际上已经取代了 C (K&R 版)并持续作为标准 C 的蓝图。

C++ 发明的早期(1980s)就有了和 C 一样庞大的用户量,并且在事实上推动了 C 的发展。例如 ANSI C 吸收了 C++ 的 void,函数原型,const 等等,C99吸收了 for 初始化,long long,禁止隐式 int,// 注释,inline;C11 吸收了原子操作,线程局部,对齐,Unicode,静态断言;C23 吸收了大括号初始化,属性,数字分割,nullptr,布尔值。并且 C23 直接禁止了原始 C 的函数声明方式,只允许使用 C++ 的方式。另外 C++ 之父尤其重视类型安全,现在 C 的类型系统也是受 C++ 影响而改进的。

C 语言从 C 89 开始就已经存在着非常强烈的从 C++ 吸收特性的趋势,Linus 最近批准 Linux 使用 C11,目的是为了引入 for 声明(C99 加入),而这个特性在 1980s 就出现在 C++ 中了。

现在写的所谓的 C,如果拿到 1989 年(C 第一次标准化)之前,不会有人认为是 C,而会认为是 C++,因为现在这种函数声明方式都是 C++ 发明的。

C 曾经有过很多方言,这些方言写法都有一定差异,C 语言标准化的一部分原因就是为了消除其他方言,从这种角度讲,标准化的 C 选择了 C++ 的 C 部分(C++ 方言)作为基础。并且现在 C 和 C++ 的标准委员会也都有着比其他语言更为紧密的联系:C 标准委员会和 C++ 标准委员会会互相审核对方的一部分提案,以保持足够的兼容性。

工业界和主流的编译器 GCC,Clang 和 MSVC 都使用 C++ 进行开发,而不是 C,足以说明 C++ 和 C 的关系和地位。因此,C 和 C++ 保持着紧密联系的同时在实际应用中选择了两个方向:如果项目不需要过多复杂特性,并且找不到足够的合格的 C++ 程序员维护,或者要求编译结果更可控,那就选择 C,如果不是,则使用 C++。

有些人提到 C 的兼容性问题,我这里要指出,C 的兼容性没梦想中那么好,Windows 为了解决 ABI 问题要带一大堆 MSVCRT.dll,而 GCC 在 Linux 上根本就不管兼容性,每一版 GCC(glibc)都不保证和之前的版本兼容,兼容性好是因为没遇到或者有人擦屁股了而已,不是天生的。另外放在 20 年前,每个平台都有数个编译器,并且这些编译器都是商业化的,凭什么互相兼容,事实上也根本不兼容。C++ 之父在 1994 年的《D&E》就指出了这一点,有些人却觉得 C 是 2001 年(x86_64 诞生,使得各大编译器进行了一次进化),或者 2005 年(Clang 诞生)凭空冒出来的,之前的历史都不存在。


若无特殊声明,本文以 CC BY-SA 3.0 许可协议 提供。