关于C++编译器的几个问题:GCC,MSVC,Clang,Comeau等

Naw*_*waz 6 c++ compiler-construction gcc clang visual-c++

关于C++编译器我几乎没有问题

  • C++编译器是否需要是单程编译器?标准是否在任何地方谈论它?

  • 特别是GCC一次性编译器?如果是,那么为什么它在这个例子中两次产生以下错误(尽管模板参数在每个错误消息中是不同的)?

    错误:'adder <T> item'
    声明阴影参数错误:'adder <char [21]> item'声明阴影参数

一个更普遍的问题


有用的链接:

Jam*_*nze 5

关于如何实现编译器,该标准没有规定任何要求.但是"一通"是什么意思?今天大多数编译器只读取输入文件一次.它们创建一个内存表示形式(通常以某种形式的解析树形式),并且可以对其进行多次传递.并且几乎肯定会对其中的一部分进行多次传递.例如,编译器必须在每次实例化时对模板的内部表示进行"传递".没有办法避免这种情况.在定义任何实例化之前,G ++还会对模板进行"传递",然后报告一些错误.(标准委员会明确地设计了模板,以便在定义时允许最大程度的错误检测.例如,这是在某些地方要求typename的动机.)即使没有模板,编译器通常也必须进行两次传递如果在其中定义了函数,则在类定义上.

关于更普遍的问题,我认为你必须准确定义"一通"的含义.我不知道今天有多少编译器多次读取源文件,但几乎所有编译器都会多次访问解析树中的部分或全部节点.这是一次通过还是多通?过去这种区别更为重要,因为内存不足以在内部表示中维护大部分源代码.像Pascal这样的语言,以及较小程度的C语言,有时被设计为易于使用单通道编译器实现,因为单通道编译器会明显更快.今天,这个问题在很大程度上是无关紧要的,现代语言,包括C++,往往忽视它; 其中C++似乎符合单程编译器的需要,它主要是出于C兼容性的原因,并且C兼容性不是问题(例如在类定义中),它通常使声明顺序无关紧要.