为什么有些这些编译而有些不能编译?
场景1:编译错误 'main' : redefinition; previous definition was 'data variable'
#include <iostream>
using namespace std;
int main;
int main(){ }
Run Code Online (Sandbox Code Playgroud)
场景2:编译错误 syntax error : missing ';' before identifier 'obj
#include <iostream>
using namespace std;
class main { };
int main(){
main obj;
}
Run Code Online (Sandbox Code Playgroud)
情景3:工作正常
#include <iostream>
using namespace std;
class main { };
int main(){
class main obj;
}
Run Code Online (Sandbox Code Playgroud)
情景4:工作正常
#include <iostream>
using namespace std;
class main {};
main obj;
int main(){ }
Run Code Online (Sandbox Code Playgroud)
名称查找工作中的条款名称.查找名称,与名称指定的名称无关.
在同一范围内,不允许将同一名称声明为函数和变量.
但是,class X即使X是函数名称或变量,也允许存在.如果有class X,则将当前范围X作为名称(指定该类).如果同一范围X声明为typename和variable name,则只需查找即可x查找变量名称.
如果新作用域声明,X那么X该作用域中的任何使用都会找到在其作用域中声明的名称,这称为阴影.(名称查找搜索当前范围,然后搜索包含该范围的范围,依此类推到全局范围).
错误,尝试声明main为函数和变量
要处理main obj;,请main查找名称.首先检查当前作用域,找到函数名称main; 所以它不会检查全局范围.我们说内部范围的名称会影响外部范围的名称.所以,这是你得到的同样的错误void foo(); foo obj;
class main毫不含糊地说要查找班级名称main; 但是没有发现int main()它会回到检查全局范围.
什么都不新,main obj;没什么区别.
另一个有趣的例子是:
int x;
class x { };
int main()
{
x = 1; // ok
x y; // error, `x` means the int
class x y; // ok
}
Run Code Online (Sandbox Code Playgroud)