在不同的空格中使用同名的variables

此代码编译,但在Visual Studio中有一个运行时错误:

运行时检查失败#3 – 正在使用variables“x”而未被初始化…

int x = 15; int main() { int x = x; return 0; } 

我不明白,行为…在错误框中,当我点击继续程序继续,x有一个损坏的内容(如-8556328而不是15 )。

为什么这个代码在没有问题的情况下工作,并且int数组已经被很好地声明了?

 const int x = 5; int main() { int x[x] = {1,2,3,4}; return 0; } 

x定义在=的左边。

所以在x[x][x]指的是全局的,

而在x = x;x隐藏全局x并从它自己初始化 – > UB。

当你声明一个新的variables时,它的名字在这里变得可见

 int x = // ^- there 

因为在这一点上variables是完全公开的,因此, 它的名字意味着什么。 此时,周围范围内的任何其他(之前声明的variables)将被隐藏。

C中没有范围parsing运算符,因此可能无法使用

 int x = x; 

在你的程序中。

请使用SRO(范围parsing运算符::)来告诉编译器哪个x是真实的x在你的脑海里。 由于用户定义的名称被破坏(名称被修饰),为了避免模糊性,这些只是编译器使用的最适合它的名称

 int x = 15;// Real name = gui_x int main() { int x = x;// lui_x return 0; } 

通过这种方式,运行时将知道您正在使用的是哪个版本,但要避免使用特定名称的歧义。 有时出现以上问题,您不知道您使用的是已经使用的名称。 为此C ++创build了SRO。
现在,如果数组x是地址&不是整数存储的东西,这就是为什么编译没有混乱。 你需要写

 namespace abc //now all global variables are belongs to this ns abc int x = 15;// Real name = gui_x int main() { int x = abc::x;// lui_x return 0; }