也许最重要的原因是缺乏先前的艺术。由标准委员会添加到C中的功能非常少,既没有成为流行扩展,也不是编写严格符合规范的代码所必需的。
C语言有一些模糊定义的“精神”,C99的解释(V5.10)中说道(第3页,强调我的部分):
一些精神方面可以用以下词汇概括:
- 相信程序员。
- 不要阻止程序员做需要做的事情。
- 保持语言简单。
- 对于某种操作提供唯一的方法。
- 让它快速运行,即使它不能保证可移植性。
此外,C语言试图与旧版本保持向后兼容性。例如,旧式声明已在C89中被标记为过时,但仍然是C11的一部分。同上引文,第2页:
现有的代码很重要,但现有的实现并不重要。有大量商业价值的C代码存在。我们已经尽力确保这些代码能够被符合标准的实现接受。C89委员会并不想强迫大多数程序员修改他们的C程序,只是为了让它们被一个符合规范的翻译器接受。
C和C++之间的一些区别至少部分原因是函数重载,例如字符常量的类型。
int foo(int);
int foo(char);
...
foo('x');
在C++中,这将调用
foo(char)
,但在C中,
'x'
的类型是
int
,因此结果可能会令人惊讶,或者
'x'
需要是
char
类型,这可能会破坏现有的代码。此外,您可能希望在有意义的地方进行一些提升,例如如果在上一个示例中没有给出
foo
的第二个声明,则
'x'
将被提升为
int
并调用
foo(int)
。这样的规则可以变得非常复杂(
void *
是否应该隐式转换为函数调用?)。(不是硬性数字,但C++标准中有关函数重载的章节(第13章)在n3797草案中占据了约30页,ibid章节5.2.2关于函数调用的部分比相应的C标准部分要长得多。)
几乎C的每个特性都是构成最小语言所必需的(好吧,除去历史遗留问题),很少有语法糖;函数重载可以被认为是这样的(您可以将函数命名为
foo_int
和
foo_char
等,并明确调用正确的函数)。
您提出的原因是循环的(因此不适用):C确实采用了一些C++功能(例如函数原型);并且在C++中引入了函数重载,因为C缺少它(您不能说“它不是C的一部分,因为它是C++的一部分;而它是C++的一部分,因为它不是C的一部分”)。第二个关于C和OOP的建议也是如此。
我个人喜欢C的原因是它与机器非常接近。通常很容易看出从C代码生成的汇编输出与其相关。符号名称未被混淆,可以轻松识别。语言保持简单和最小化。坦白地说,我不明白人们希望看到某些C++功能合并到C中时追求什么:我们有C ++,这种语言提供了这些功能,具有编写特定于平台的高效代码的能力;为什么不直接使用它呢?
C11引入了
_Generic
,这可能会对您有所帮助。