在不同的空格中使用同名的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; }