gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:04 26 4
gpt4 key购买 nike

我有几个关于 C++ 编译器的问题

  • C++ 编译器是否需要 one-pass compiler ?标准是否在任何地方谈论它?

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

    error: declaration of ‘adder<T> item’ shadows a parameter
    error: declaration of ‘adder<char [21]> item’ shadows a parameter

一个更一般的问题


有用的链接:

最佳答案

该标准对以下方面没有任何要求编译器是如何实现的。但是你是什么意思“一次通过”?今天的大多数编译器只读取输入文件一次。他们创建一个内存表示(通常在某种解析树的形式),并可能进行多次传递在那之上。几乎可以肯定地多次通过零件它的。编译器必须“通过”内部每次实例化时模板的表示,对于例子;没有办法避免这种情况。 G++ 也使在定义模板时,在任何模板之前“通过”模板实例化,然后报告一些错误。 (标准委员会明确设计的模板允许最多在定义点进行错误检测。这是某些类型名称要求背后的动机地方,例如。)即使没有模板,编译器也会通常必须对类定义进行两次传递,如果里面定义了函数。

关于更笼统的问题,我认为你会必须准确定义“一次通过”的含义。我不知道今天有哪个编译器会多次读取源文件次,但几乎所有人都会访问其中的部分或全部节点不止一次解析树。这是一次通过还是多次通过?这区别在过去更为显着,那时内存还没有足以在内部维护大部分源代码表示。像 Pascal 这样的语言,在较小程度上C,有时被设计成易于使用单个通过编译器,因为单次通过编译器将是明显更快。今天,这个问题基本上无关紧要,而现代语言,包括 C++,往往会忽略它;在哪里C++似乎符合one-pass编译器的需求,它是主要是出于 C 兼容性的原因,并且在哪里C 兼容性不是问题(例如在类定义中),它通常使声明的顺序无关紧要。

关于c++ - 关于 C++ 编译器的几个问题 : GCC, MSVC、Clang、Comeau 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5322956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com