我有一段代码:
#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
的函数调用一次会发生什么:如果不查看所有调用方,就根本无法预测函数的作用。这是非常不切实际的。