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

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

本文关键字:范围内 局部变量 另一个 C++      更新时间:2023-10-16

我想在另一个作用域中访问main函数的局部变量。
我的目标是打印 20 英寸 cout .
我该怎么做?
怎么可能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的方法。

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

您不能访问其范围之外的变量(在某些情况下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 或生成文件中。

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

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

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

关于您的示例代码

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

以及评论中的既定目标,

" 我想在主范围内打印var变量

...您可以按如下方式执行此操作,只需为其添加别名

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(语言创造者)那里知道这一点。关于缺乏相对范围解析和缺乏全局命名空间别名的基本原理,这只是一个有条件的猜测,它是相同的,但它是有道理的。:)