通过使用全局变量的函数访问在给定范围内被覆盖的变量

Access variable that was overwritten within given scope via function that uses global variables

本文关键字:范围内 变量 覆盖 访问 全局变量 函数      更新时间:2023-10-16

我有一段代码:

#include <stdio.h>
// global variable definition
int x = 0;
void access_global(){
cout << "ACCESSING FROM access_global()" << endl;
if (x > 0){
cout << "LOCAL VARIABLE" << endl;
cout << x << endl;
}
else{
cout << "GLOBAL VARIABLE" << endl;
cout << x << endl;
}
}

int main(int, char*[])
{
// declare new variable in given scope with same name as global variable
int x = 1;
cout << "ACCESSING FROM main()" << endl;
if (x > 0){
cout << "LOCAL VARIABLE" << endl;
cout << x << endl;
}
else{
cout << "GLOBAL VARIABLE" << endl;
cout << x << endl;
}
access_global();
return 0;
}

它输出:

ACCESSING FROM main()
LOCAL VARIABLE
1
ACCESSING FROM access_global()
GLOBAL VARIABLE
0

为什么access_global()不访问main()作用域中的x?是否可以修改access_global()函数,使其显示main()范围内的主要x变量,如果未定义,则显示main()之外定义的变量?如果不可能,你能解释一下原因吗?感谢

为什么access_global()没有访问main()作用域中的x

因为main::x不在access_global的范围内。幸运的是,名称不仅仅"泄漏"到函数的作用域之外。全局x是它能看到的唯一x

是否可以修改access_global()函数,使其显示main()作用域中的主要x变量,如果未定义,则显示main()之外定义的变量?

不是你希望的,不是。main中的名称与access_global中的名称在任何意义上都没有关联。

如果不可能,你能解释一下为什么吗?

像往常一样:因为标准是这么说的。为什么会这样做还有一些猜测,但如果某个函数的含义根据调用上下文中存在的名称而改变,这肯定会让非常困惑,而这是编写函数时通常无法控制的。

想想看,如果access_global从一个具有某些x(甚至可能不是int类型)的函数中调用一次,以及从一个没有本地x的函数调用一次会发生什么:如果不查看所有调用方,就根本无法预测函数的作用。这是非常不切实际的。