3

我最近在cppreference 中看到了这段代码:

string str="global scope";

void main()
{
    string str="main scope";
    if (true){
        string str="if scope";
        cout << str << endl;
    }
    cout << str << endl;
}

哪个输出:

if scope
main scope

这很好,我了解整个嵌套范围的事情,并且我知道当堆栈在语句结束时展开它时,if 范围内的“str”将被销毁,因此在那之后它将不可用,因此第二个print 将主要的“str”作为其参数。

但是,我知道主“str”实际上在 IF 中可用,或者至少应该是可用的,但问题是如何从 IF 语句中访问主“str”?

我怎么能从 main 和/或 if 内部访问全局“str”?

我知道只使用不同的名称会更简单,但是这个问题不是针对特定的实际应用程序,而是为了更好地理解 c++ 范围。

4

2 回答 2

4

这是一个隐藏名称的问题。和

如何从 IF 语句中访问主“str”?

不幸的是,这是不可能的。无法访问这些隐藏的本地名称。

我怎么能从 main 和/或 if 内部访问全局“str”?

您可以对其使用范围解析运算符 ::,例如::str,它指的str是全局范围内的名称。

于 2017-01-25T02:59:11.190 回答
3

if块不能引用 中str定义的变量main(),除非您更改其中一个变量的名称。无法访问与内部变量同名的外部变量。

但是,可以使用::运算符访问全局变量。

虽然,使用指针可以解决问题:

string str = "global-scope";

void main()
{
    string str = "main scope";
    string *ptrOfStr = &str;
    if (true){
        string str = "if scope";
        cout << str << endl;
        cout << "Value of str in main block : " << *ptrOfStr;
    }
    cout << str << endl;
}
于 2017-01-25T03:06:25.980 回答