出于好奇:如果我有嵌套的范围,就像在这个示例C ++代码
中一样using namespace std;
int v = 1; // global
int main (void)
{
int v = 2; // local
{
int v = 3; // within subscope
cout << "subscope: " << v << endl;
// cout << "local: " << v << endl;
cout << "global: " << ::v << endl;
}
cout << "local: " << v << endl;
cout << "global: " << ::v << endl;
}
有没有办法从“中间”范围(全局或本地)访问值v
的变量2
?
答案 0 :(得分:17)
您可以将新引用声明为别名
int main (void)
{
int v = 2; // local
int &vlocal = v;
{
int v = 3; // within subscope
cout << "local: " << vlocal << endl;
}
}
但我会完全避免这种做法。我花了好几个小时调试这样的构造,因为变量在调试器中显示为因为范围而改变了,我无法弄清楚它是如何被改变的。
答案 1 :(得分:7)
答案是否你不能。
局部范围内的变量会将变量隐藏在全局范围内,并且语言提供了一种通过使用全局限定名称来访问全局变量的方法。但是C ++作为一种语言无论如何都无法访问中间范围的变量。
考虑到它必须被允许,它需要大量复杂的处理,想象一下n个范围的情况(很可能是无限的)和处理它们。
最好重命名中间变量并使用那些更合理且易于维护的变量。
答案 2 :(得分:5)
C ++中有两种类型的scope resolution运算符 - 一元范围和一个类范围。没有函数范围或“任何特定父范围”解析运算符。这使得无法解决您的问题,因为它通常是因为您无法引用匿名范围。但是,您可以创建别名,重命名变量,或将其作为类的一部分,这当然意味着代码更改。这是我在没有重命名的情况下最接近你的情况:
#include <iostream>
using namespace std;
int v = 1; // global
class Program
{
static int v; // local
public:
static int main ()
{
int v = 3; // within subscope
cout << "subscope: " << v << endl;
cout << "local: " << Program::v << endl;
cout << "global: " << ::v << endl;
}
};
int Program::v = 2;
int main ()
{
return Program::main ();
}
还有其他方法,比如确保变量没有优化并且在堆栈中,然后你可以直接使用堆栈来获取你想要的变量的值,但是不要那样。
希望它有所帮助!
答案 3 :(得分:2)
你可以这样假装:
#include <iostream>
using namespace std;
int v = 1;
int main()
{
int v = 2;
{
int &rv = v; // create a reference
int v = 3; // then shadow it
cout << "subscope: " << v << endl;
cout << "local: " << rv << endl;
cout << "global: " << ::v << endl;
}
cout << "local: " << v << endl;
cout << "global: " << ::v << endl;
return 0;
}
有趣的是,如果你试图运行它,这会编译cygwin g ++但会出现段错误:
#include <iostream>
using namespace std;
int v = 1;
int main()
{
int v = 2;
{
int &v = v;
cout << "subscope: " << v << endl;
// cout << "local: " << v << endl;
cout << "global: " << ::v << endl;
}
cout << "local: " << v << endl;
cout << "global: " << ::v << endl;
return 0;
}