C++代码在编译之前是否转换为C?
一些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"时间框架(并且在本书中有关于它的各种其他细节).
不,但像大多数神话一样,这里有一丝真相.带有类的C的原始编译器(后来成为C++)被昵称为CFront并且确实转换为C.
不是在大多数现代编译器中.
然而,原始的C++编译器实际上是一个预处理器.它生成了C代码,然后由C编译器编译whaic.
在C++编译器的早期,有些人就这样做了.但是,从20世纪80年代后期开始,我还没有看到过以这种方式实现的C++编译器.