C ++是建立在C之上的吗?

时间:2010-02-09 05:32:38

标签: c++ c compiler-construction

编译前C ++代码是否转换为C?

6 个答案:

答案 0 :(得分:22)

一些C ++编译器(原始cfront,Comeau C ++)在编译期间使用C作为中间语言。大多数C ++编译器使用其他中间语言(例如llvm)。

编辑:由于似乎对历史存在一些误解:“C with classes”开始使用名为“Cpre”的预处理器。当时,它被严格地视为C的方言,而不是单独的语言。 1983年12月,人们开始将其视为一种单独的语言,并且发明了C ++的名称。碰巧的是,cfront的开发始于1983年4月,因此可以使用一个合理可用的版本(对于少数几个),几乎与“C ++”这个名称开始使用时相同。这似乎是巧合,但不是一个计划。

就产生C作为输出而言,这在Unix上非常普遍。例如,Berkeley Pascal编译器和至少一些Fortran编译器也将C作为输出。

然而,Cpre和Cfront之间存在巨大差异。尽管两者都将C作为输出,但Cpre几乎没有对其自身进行语法检查 - 它查找了一些特定的东西,并对它们进行了相对机械的翻译。直到C编译器查看结果才进行了真正的语法分析。如果您的代码包含语法错误,则几乎可以肯定,在C编译器解析Cpre的输出之前,它不会被捕获。

然而,Cfront对源代码本身进行了完整的语法分析,因此(在其代码生成器中没有错误)你永远不会看到来自C编译器的语法错误。 C编译器只是用作代码生成器,因此没有人需要重写CFront以适应不同的处理器,目标文件格式等。

如果您想了解更多详细信息, C ++的设计和演变的第2章几乎完全专注于“C with Classes”时间框架(还有其他各种细节)贯穿整本书。)

答案 1 :(得分:13)

不,但像大多数神话一样,这里有一丝真相。带有类的C的原始编译器(后来成为C ++)被昵称为CFront并且确实转换为C语言。

答案 2 :(得分:6)

不是大多数现代编译器。

然而,原始的C ++编译器实际上是一个预处理器。它生成了C代码,然后由C编译器编译whaic。

答案 3 :(得分:5)

在C ++编译器的早期,有些人就是这样做的。我没有看到自20世纪80年代后期开始以这种方式实现的C ++编译器。

答案 4 :(得分:2)

其他人已经回答了。 NO。

但是,如果你想使用像C#这样的OOP语言,并将你的代码编译成C,我建议你看一下Vala

答案 5 :(得分:2)

标题似乎要求C ++是C的超集,即你可以将任何c代码转储到c ++编译器中它会起作用吗?在这种情况下,是的,有点......

一个主要的区别是C自动为你投射指针,c ++没有,你需要手动投射......

任何人还记得其他什么吗?

这就是我记得从一个巨大的C项目转换为c ++的可怕过程中出于某种原因......