gpt4 book ai didi

c++ - 函数、类和变量都具有相同的名称

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:19 25 4
gpt4 key购买 nike

为什么有的能编译有的不能编译?

场景一:编译错误 'main' : redefinition;先前的定义是“数据变量”

#include <iostream>
using namespace std;
int main;
int main(){ }

场景 2:编译错误 syntax error : missing ';'在标识符 'obj

之前
#include <iostream>
using namespace std;
class main { };
int main(){
main obj;
}

场景 3:工作正常

#include <iostream>
using namespace std;
class main { };
int main(){
class main obj;
}

场景 4:工作正常

#include <iostream>
using namespace std;
class main {};
main obj;
int main(){ }

最佳答案

名称查找根据名称 进行。查找名称,独立于该名称指定的内容。

不允许在同一范围内将同名声明为函数和变量。

但是,即使 X 是函数或变量的名称,也允许 class X 存在。当您拥有 class X 时,当前作用域将获得 X 作为名称(指定该类)。如果同一范围将 X 声明为类型名和变量名,则只需查找 x 即可找到变量名。

如果一个新作用域声明了 X,那么在该作用域中对 X 的任何使用都会找到在其作用域中声明的名称,这称为 shadowing . (名称查找搜索当前范围,然后搜索包含它的范围,依此类推直到全局范围)。

  1. 错误,尝试将 main 声明为函数和变量

  2. 要处理 main obj;,查找名称 main。首先检查当前作用域,找到函数名 main;所以它不检查全局范围。我们说内部作用域的名称​​阴影 外部作用域的名称。因此,这与您从 void foo(); 得到的错误相同。 foo obj;

  3. class main 明确表示要查找类名main;找不到 int main() 所以它回退到检查全局范围。

  4. 没什么新的,main obj; 没什么区别。

另一个有趣的例子是:

int x;
class x { };

int main()
{
x = 1; // ok
x y; // error, `x` means the int
class x y; // ok
}

关于c++ - 函数、类和变量都具有相同的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966937/

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