为什么C++向后兼容C?为什么没有一些"纯粹的"C++语言?

jok*_*oon 12 c c++ history

C和C++是不同的语言,我们知道blababla.

但如果这些语言不同,为什么仍然可以使用malloc或free这样的函数?我确信C++有各种各样的尘土飞扬的东西,因为C,但是由于C++是另一种语言,为什么不删除这些东西,使它变得不那么臃肿,更干净清晰?

是因为它允许程序员在没有OO模型的情况下工作,还是因为某些编译器不支持C++的高级抽象功能?

Joh*_*itb 23

因为C++不会像现在这样与C兼容,所以C++会死掉.除了粉丝之外,没有人会喜欢C++,如果它与C不兼容(我知道我可能会因此而被投票.就这样吧!).

  • C++首先有没有粉丝? (6认同)
  • @Johannes:我不同意.像Java和C#这样的语言很好,没有像C++那样的任何直接C兼容性. (3认同)
  • Java的杀手级应用程序在任何地方都可以一次编写,c#在Windows上很容易进行应用程序开发.C++的杀手级应用程序使用的是你在c中完成的系统编程,但是面向对象.不同的市场. (3认同)
  • @DeadMG:Java和C#通常不适合系统编程 - 苹果和橘子,我的朋友...... (2认同)
  • @Johannes:我不同意.C++提供的不仅仅是带有类的C语言.例如,模板比任何一种语言中的泛型都强大得多.在我看来,C++问题的一半原因是它试图超便携,这是毫无意义的,因为你不能完全采用Win32的GUI程序,并使其在嵌入式处理器上运行,无论如何都没有变化. (2认同)
  • @DeadMG:我对 GUI 编程一点也不在乎 :) 无论如何,C++(可能)非常受欢迎,因为 C 交互是如此简单:请注意命名一种语言,在该语言中导出与 C 兼容的接口与使用 `extern "C 一样简单“ { ... }` ?这意味着人们可以相当容易地使用现有的 C 库并在 C++ 中插入 C 代码。现在不要误会我,作为 C++ 的日常用户,我开始厌恶许多 C 主义(并且未定义的行为肯定是我个人的烦恼之一),但您无法重塑历史。 (2认同)

Kos*_*Kos 16

关于"为什么没有"纯粹的"C++语言......好吧,至少有一个.最流行的一个叫D,它很棒,设计精良,功能丰富,编码愉快,你可以使用C语言图书馆用它.

啊,几乎没人用它.:)

直接原因是C++还不足以让人们有充分的理由将数百万行遗留代码移植到更现代的代码中,正如你所描述的那样,像D这样的"纯粹"语言.

  • 这并没有回答关于C和C++之间关系的问题,而是插入另一种语言. (9认同)
  • 那么,问题的第二部分与我直接相关. (4认同)
  • D很有意思,但我不会称之为"纯粹的C++"......它是一种不同的语言,具有许多相同的目标,没有传统的C行李. (3认同)
  • @dajames:这听起来与 OP 要求的完全一样。 (2认同)

Pup*_*ppy 7

它的设计使您可以移植C代码并直接将其编译为C++代码,并允许对现有代码进行增量升级.如果C++没有malloc/free,你就无法将现有的C代码编译成C++,因为你需要支付一些可怜的傻瓜来查找所有malloc调用并替换它们,这很昂贵.


Chr*_*oph 7

大多数操作系统都公开了一个C API,所以如果你想使用C++进行系统编程,你需要一定程度的C互操作性.

将C标准库合并到C++标准库中具有历史和实践的原因:C++作为C的扩展开始其生命,并且C标准库已经可以使用了.排除部分库(如mallocfree)是愚蠢的,因为有更多惯用的C++替代方案:如果你想做愚蠢的事情,C++会给你这样做的权力.

对于实际的语言语义,同样适用 - 但程度较低 - 并且由于向后兼容性,C++永远不会完全摆脱其C语言遗产.


daj*_*mes 5

C++被设计为与C兼容 - 事实上它最初是C的超集,但C语言已经改变以打破它.

这意味着可以从C++代码调用C库 - 包括C运行时库.它并不意味着它是一个好主意,这样做!

如果你想要一个"纯粹的"C++,那么你可以在不调用任何C库的情况下使用C++.

[正如其他人说的那样,自从我开始输入这个内容之后:C++的设计和演变是一个开始阅读背景的好地方.]

  • @Tim:不,`sizeof(char)`在C中也是1.在C中输入`int`是''c',但在C++中键入`char`; 因此`sizeof('c')`在C中是4,在C++中是1. (4认同)