gpt4 book ai didi

c++ - 为什么 C++ 不允许在声明函数之前使用它们?

转载 作者:IT老高 更新时间:2023-10-28 22:41:30 26 4
gpt4 key购买 nike

好的,我知道这看起来像是 Why do functions need to be declared before they are used? 的拷贝但似乎现有的答案并没有完全解决所有细节。

我知道 C++ 最初是在 80 年代设计的,因此可以一次性翻译,因为计算机速度很慢。好的。但是最新的标准是在 2011 年发布的,所以我不明白为什么 C++ 编译器现在不能做需要多次通过的事情。是的,它仍然会损害性能,但前提是它确实变得有必要。所以以下仍然只需要一次通过:

void foo();
int main() { foo(); }
void foo() {}

而对于以下情况,编译器可以生成两个(并且速度更慢),因为它不知道 foo 是函数还是类型,直到它看到下面的声明:

int main() { foo(); }
void foo() {}

如果您尝试使用函数而不先声明它,并且声明根本不在当前翻译单元中,那么这将是一个错误。但如果它在同一个翻译单元中,那么编译器可以进行额外的传递。

我的同事认为,这样的功能可以节省大量开发人员的时间,并且可以避免声明和定义不匹配的问题。我敢肯定,这已被多次提出,但每次都被拒绝。拒绝它的实际理由是什么,委员会的理由是什么?

最佳答案

模板解析

考虑以下代码行:

a < b , c > d;

你会如何解析这个?其实有两种方式,取决于abcd是什么。一、变量声明

a<b,c>   d;
^^^^^^ ^
Type Var

a 是已知模板类型的情况下,bc 是其他已知类型。其次,

   a<b   ,   c<d ;
^^^ ^^^
boolean expressions

abcd 都是某种变量的情况下。

令人头疼的解析

或者这里是另一个:

a b(c); // is 'b' a function or a variable?

这可以是函数声明(返回类型为 a 和参数类型为 c 的函数)或变量定义(其类型为 a 并且其构造函数参数是 c)。

结论

不幸的是,有很多类似的东西。我不确定,如果不可能编写一个可以处理这种东西的编译器,但至少很难编写一个。编译时间在 C++ 中已经是一个严重的问题。这只会使情况变得更糟。另外:最好只使用您已经定义或声明的内容,即使是其他语言。

委员会的限制

即使可以合理地实现此功能,它也会扼杀向后兼容性。函数重载决议只考虑先前的声明,函数调用的解释可能会根据函数调用的编写位置而改变。这就是 C++ 的组合方式。现在,C++ 标准委员会非常重视向后兼容性。特别是:他们不想破坏任何现有代码(这是正确的)。你的提议肯定会破坏现有的代码,这对语言设计者来说是不行的。

关于c++ - 为什么 C++ 不允许在声明函数之前使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24925831/

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