如何在 C++ 的另一个范围内使用局部变量?

How can I use local variable in another scope in C++?

我想在另一个范围内访问 main 函数的局部变量。
我的目标是在 cout.
中打印 20 我该怎么做?
在 C++ 中怎么可能?

int var = 10;

int main(int argc, char *argv[])
{
    int var = 20; // this var
    {
        int var = 40;
        cout << ::var; // I want to print `var` variable in main scope.
                       // But this command print global variable.
    }

    return 0;
}

没有办法做到这一点。该语言没有提供区分 main 中的第一个 var 和第二个 var.

的方法

如果您曾经编写生产代码,请避免使用此类变量。这将导致错误代码。您会对给定代码行中哪个变量在范围内感到困惑。

CASE A

int var = 10;
int main(int argc, char *argv[])
{
    int var = 20; // this var
    {
        int var = 40;
        cout << ::var; // This will output 10 because you have used scope of operator that'll point to global variable in C++.
    }


    return 0;
}

CASE B

int var = 10;
int main(int argc, char *argv[])
{
    int var = 20; // this var
    {
        int var = 40;
        cout <<var; // This will output 40 because you are using local variable.
    }


    return 0;
}

CASE C

int var = 10;
int main(int argc, char *argv[])
{
    int var = 20; // this var
    {
        int var = 40;
    }

    cout << var; // this will output 20 because using var that is declared in main() function.

    return 0;
}

您不能访问其范围之外的变量(在某些情况下 extern 可以使用但不能在您的代码中使用)。因此,您不能在其范围之外使用变量 var(在最里面的块内声明)。例如,

int var = 10;
int main(int argc, char *argv[])
{
   int var = 20; // this var
   {
        int var = 40;
   }

   cout << var; // this will access var declared first and prints 20 
   return 0;
}

相信我,没有必要以这种方式声明和使用变量。这将导致错误代码。请记住,如果您使用 GCC 或 clang,请在编译时始终使用 -Wshadow 编译器标志,因为如果在代码中的任何地方执行此类操作,它都会显示警告。如果您不从终端编译代码,请尝试将其包含在您的 IDE 或 makefile 中。

关于您的示例代码

int var = 10;

int main(int argc, char *argv[])
{
    int var = 20; // this var
    {
        int var = 40;
        cout << ::var; // I want to print `var` variable in main scope.
                       // But this command print global variable.
    }

    return 0;
}

…以及评论中规定的目标,

I want to print var variable in main scope

…您可以按如下方式进行,只需为其添加一个 别名

int var = 10;

int main()
{
    int var = 20; // this var
    {
        auto& outer_var = var;
        int var = 40;
        cout << outer_var;
    }
}

C++ 不提供可以为您执行此操作的范围解析机制。如果有这样的机制,例如相对范围解析或函数名称作为伪命名空间名称,它可能会被使用,然后人们会看到至少一些代码,因为在一小段代码中对不同的事物使用相同的名称而难以理解。另一种语言设计如 C#,其中隐藏(如内部 var 隐藏外部 var)完全被禁止。

同样,C++ 也没有提供任何方法来为全局命名空间提供额外的名称。其他名称空间可以使用别名,但全局名称空间不能,因此可以非常确定全局名称空间不是通过看起来像 companyname::counter 的东西引用的,比如说。

C++ 还限制了命名空间作用域函数可以重载哪些运算符,再次提供了一种健全的衡量标准,这是人们绝对可以依赖的。关于最后一个理由,我从 Bjarne Stroustrup(语言的创造者)那里了解到。关于缺乏相对范围解析和缺乏全局命名空间别名的基本原理,这只是一个合格的猜测,它是相同的,但这是有道理的。 :)