在编译之前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”时间框架(并且在本书中有关于它的各种其他细节).