C++ 嵌套作用域访问

C++ Nested Scope Accessing

我最近在 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' 会在语句结束时堆栈展开时被销毁,所以它不会在那之后可用,因此第二个打印将主要 'str' 作为其参数。

但是,我知道 main 'str' 实际上在 IF 中可用,或者至少应该可用,但问题是 如何访问 main 'str' 来自 IF 语句?

我如何从主 and/or if 内部访问全局 'str'?

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

这是一个 name-hiding 问题。并且

how can I access the main 'str' from inside the IF statement?

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

And how could I access a global 'str' from inside the main and/or the if?

您可以使用 scope resolution operator :: 作为它,例如::str,在全局范围内引用名称str

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

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

不过,可以使用指针解决问题:

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;
}