Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数、类和变量都具有相同的名称_C++_Name Lookup - Fatal编程技术网

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

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

为什么有些是编译的,有些不是编译的

场景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 <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++的。你的代码没有“输出”任何东西。