C和C++之间的关系

9
当 Stroustroup 设计 C++ 时,他的一个目标是让 C++ 尽可能成为 C 的超集。我知道这并不完全正确,但大部分好的 C 代码也可以作为 C++ 代码。
但我听说 C99 支持许多 C++ 不支持的东西(如 VLA),而且甚至会有所谓的 C1x 或 C0x。所以,C++ 只是 C89 的超集,从那时起,C 和 C++ 就基本上独立发展了?

"C++0x"是下一个C++版本。 - darioo
@Armen:那就是他们说的;-)编辑:当你提到“C1x”或“C0x”时,我以为你指的是C++0x。 - darioo
@darioo:我所说的C0x或C1x是指C语言的下一个版本,而不是C++ :) - Armen Tsirunyan
4
大多数优秀的 C 代码无法编译为 C++。如果您使用适当的 C 语言习惯用法,必须费尽心思使它们变得丑陋,以便能够编译为 C++。最显而易见的例子就是任何对 malloc 的使用。 - R.. GitHub STOP HELPING ICE
1
@R:这在 ANSI C 中确实是真的,但对于 K&R C 却不是,它实际上是 C++ 和 ANSI C 的共同祖先。 - Nemanja Trifunovic
显示剩余2条评论
6个回答

7

C++是C89/C90的一个近乎超集。虽然我不建议编写旨在能够编译为C或C++的代码。此后,C99开始分歧。新的C++标准(通常称为C++0x)将尝试更兼容,但不会有像C99可变长数组之类的东西。Stroustrup对C委员会的一些行动表示失望,显然他曾期望他们试图更接近C++的兼容性。

所以,是的,这两种语言正在分化。


1
+1 表示“近似超集”,C 语言是弱类型的,而 C++ 的类型系统则不那么宽容。 - Matthieu M.
1
@MSalters:我认为并没有完全正确。'int * foo = malloc(42 * sizeof(int));'是合适的C代码,但它不会在C++中编译。将(int *)强制转换添加到malloc中可以使其在C++中编译,但是在C中唯一的作用是掩盖了如果您忘记了#include <stdlib.h>。自从我遇到了这种情况以来,我一直主张知道你正在编写C代码还是C++代码,并不限制自己只使用公共子集。的确,更糟糕的C语言结构通常无法在C++中使用。 - David Thornley
2
如果你用 sizeof *foo 替换 sizeof(int) 会更好,这也说明了一个重要的原因:不要强制转换返回值(否则,如果你改变类型,代码就会出错)。 - R.. GitHub STOP HELPING ICE
@R:非常感谢,我已经有一段时间没有用C语言编程了,所以显然有些生疏。你的内存分配方式更好,而且你忽略强制类型转换的原因也更加合理。 - David Thornley

4

没错。C++ 最初是作为 C 的超集开发的。自那时起,这两者已经独立发展。


1
我不确定C++是否曾经是任何版本的C的严格超集。当然,第一个C++标准并非完全兼容C。 - Marcelo Cantos
1
@Marcelo:Stroustrup的《C++设计与演化》提到,1980年的带类C语言并不完全兼容C语言,因为int class;在C语言中是可以的,但在带类C语言中是非法的。随着C++的发展,引入了更多的不兼容性。 - David Thornley

3

有一项协调一致的工作是尽可能使语言兼容,C++0x将采用一些C99的更改。但它似乎很可能会在某种程度上分歧,其中VLAs是最显着的差异。我不知道C++是否也会采用restrict


下一个C++标准已经快完成了,不会再添加新功能。由于这是将包含C99兼容性功能的标准,我认为它们正在朝着另一个方向发展。 - David Thornley
1
@David:你不同意我写的某件事吗? - Marcelo Cantos
我猜这只是挑剔。你说它们似乎可能会分歧;我想说的是,实际上它们已经分歧了。 - David Thornley
@David:也许我的措辞有点懒散。我的意思是,“将建立一种长期的分歧模式。”即使编程语言标准也不是永远固定的,C++最终可能会采用许多它在这次避开的C99特性,即使只是为了重新获得一些失去的兼容性,如果证明这很重要(而且很痛苦)。此外,问题是这些语言是否“相当独立地发展”。仅仅说它们正在分化并不能完全说明问题。 - Marcelo Cantos

3

他坚持滥用语言中的“相等性”来集结支持。 - Matt Joiner

2

但大部分好的C代码也是C++代码。

不是这样的。

我认为大部分好的C代码可以使用C++编译器编译。
但这并不意味着它是C++代码。

C++只是旧的C89的超集,从那时起C和C++几乎是独立发展的吗?

C++是基于C89的。
C语言通过C99进行了扩展,其中很少有部分被纳入到C++03中。
目前正在努力尽可能地缩小差距,并使两种语言更加接近(在合理范围内),以便于C++0x。


1
这句话说的是“好的C代码也是C++代码”,而不是“好的C代码也是好的C++代码”。但是,没错,这是一个重要的区别。 - aschepler

1

即使是旧的C语言,也很难处理操作符的返回值不同、控制流在一个语言中有效而在另一个语言中无效等问题。它们在函数原型、结构体等接口级别上是可以使用的。

对于较新版本的语言,这种差异更加明显,因为即使是接口兼容性也可能难以维护。 C99已经有了用于数组函数参数边界的static关键字,两种语言中编译时常量的概念也有很大不同,C++开始重用旧的关键字(auto),并过度使用未在保留命名空间中的新关键字...

所以,我认为这种分歧会越来越大,对于两个社区来说,承认分离并尝试分别相处可能会更好。


我认为双方已经"承认"离婚了,但他们仍然尽可能地相处,这似乎是明智的做法。 - jalf
@jalf:它们需要被打破。有趣的是,如果你把C++中的C去掉,只剩下一个来自80年代的过度复杂的噩梦语言。即便如此,如果再进行一些更新,放弃荒谬的C兼容性骗局,并消除所有古老的语法和样板代码,C++也可能成为一种不错的语言。但我认为这是不可行的。 - Matt Joiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接