在不同空间使用同名变量

Using a variable with the same name in different spaces

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

Run-time check failure #3 - the variable 'x' is being used without being initialized...

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;
}

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