44.3 C/C++兼容性

除少数例外,C++可视为C(这里是指C11,由ISO/IEC 9899:2011(E)定义)的一个超集。两者的大多数差异都源于C++对类型检查的极度强调。编写良好的C程序也很容易成为合格的C++程序。编译器能诊断C++和C的每处不同。C99和C++11不兼容之处都列在iso.C中。在本书(英文原版)写作过程中,C11还非常新,大多数C代码都是遵循经典C或C99的。

44.3.1 C和C++是兄弟

经典C有两个主要后代:ISO C和ISO C++。多年以来,两种语言在以不同的步调沿着不同的方向发展。造成的一个结果就是它们都支持传统C风格编程,但支持的方式有着细微不同。所产生的不兼容会使某些人非常苦恼——同时使用C和C++的人、使用一种语言编写程序但用到另一种语言编写的库的人以及为C和C++编写库与工具的人。

为何会说C和C++是兄弟呢?毕竟C++很明显是C的后代。但是,请看下面简化后的家谱:

在此图中,实线表示大量特性的继承,短杠虚线表示主要特性的借用,而点虚线表示次要特性的借用。从中可以看出,ISO C和ISO C++是K&R C的两个主要后代,因此它们是兄弟。两者在发展过程中都从经典C继承了关键特性,但又都不是100%兼容经典C。“经典C”一词是我从Dennis Ritchie的显示器上贴的便条中挑出来的。它大致相当于K&R C加上枚举和struct赋值两个特性。

不兼容对程序员来说是噩梦,部分原因是它会造成选择上的组合爆炸。考虑下面简单的维恩图解: ...

Get C++程序设计语言(第4部分:标准库)(原书第4版) now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.