在不同的空格中使用相同名称的变量

Using a variable with the same name in different spaces

本文关键字:变量 空格      更新时间:2023-10-16

这段代码可以编译,但是我在Visual Studio中有一个运行时错误:

运行时检查失败#3 -变量'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。

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

int x =
//     ^- there

,因为此时变量已完全声明,因此;它的名字是有意义的。此时,周围作用域中的任何其他(先前声明的变量)都将被隐藏。

在C语言中没有范围解析操作符,所以您可能无法使用

int x = x;

请使用SRO(作用域解析操作符::)来告诉编译器哪个x是你心目中的真实x。由于用户定义的名称是这样被修饰的,以避免在它的级别上产生歧义,这些只是编译器使用的最适合它的名称

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

这样,运行时将知道您使用的是哪个版本,但为了避免歧义,它希望您使用特定的名称。有时上述问题出现在您不知道您正在使用已使用的名称的情况下。为此,c++创建了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;
}