C++ 函数、类和变量都具有相同的名称
为什么有些是编译的,有些不是编译的 场景1:编译错误C++ 函数、类和变量都具有相同的名称,c++,name-lookup,C++,Name Lookup,为什么有些是编译的,有些不是编译的 场景1:编译错误'main':重新定义;以前的定义是“数据变量” #include <iostream> using namespace std; int main; int main(){ } 情景3:工作正常 #include <iostream> using namespace std; class main { }; int main(){ class main obj; } #include <iostre
'main':重新定义;以前的定义是“数据变量”
#include <iostream>
using namespace std;
int main;
int main(){ }
情景3:工作正常
#include <iostream>
using namespace std;
class main { };
int main(){
class main obj;
}
#include <iostream>
using namespace std;
class main {};
main obj;
int main(){ }
#包括
使用名称空间std;
类主{};
int main(){
类主对象;
}
情景4:工作正常
#include <iostream>
using namespace std;
class main { };
int main(){
class main obj;
}
#include <iostream>
using namespace std;
class main {};
main obj;
int main(){ }
#包括
使用名称空间std;
类主{};
主obj;
int main(){}
名称查找在名称方面起作用。该名称将被查找,与该名称指定的内容无关
不允许在同一范围内将同一名称同时声明为函数和变量
但是,即使X
是函数或变量的名称,也允许类X
存在。当您拥有class X
时,当前作用域将X
作为名称(指定该类)。如果同一作用域同时声明了X
类型名和变量名,则只需查找X
即可找到变量名
如果一个新的作用域声明了X
,那么在该作用域中使用X
会找到在其作用域中声明的名称,这称为隐藏。(名称查找搜索当前范围,然后搜索包含该范围的范围,依此类推到全局范围)
main
声明为函数和变量主对象
,则会查找名称main
。首先检查当前范围,并找到函数名main
;因此它不检查全局范围。我们说内部作用域的名称隐藏了外部作用域的名称。因此,这与从void foo()中得到的错误相同;富奥比代码>
class main
明确表示要查找类名main
;它找不到int main()
,因此它返回到检查全局范围主对象代码>没有区别
int x;
class x { };
int main()
{
x = 1; // ok
x y; // error, `x` means the int
class x y; // ok
}
这些错误消息是如何回答你的问题的?看起来,你已经偶然发现了C的旧的“命名空间”特性,它仅仅是出于兼容性原因才进入C++的。你的代码没有“输出”任何东西。