【问题标题】:How can I use local variable in another scope in C++? [duplicate]如何在 C++ 的另一个范围内使用局部变量? [复制]
【发布时间】:2016-07-10 06:59:19
【问题描述】:

我想在另一个范围内访问主函数的局部变量。
我的目标是在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;
}

【问题讨论】:

  • 我不明白他为什么会得到减分,他问了一个体面的问题
  • 如果您要询问 C,请不要在代码中使用仅在 C++ 中可用的功能。 C 没有范围解析运算符 (::) 并且不支持 cout 等。在 C 中,您甚至无法打印全局 var — 并且您无法打印隐藏(阴影)int var = 20;从内部块。

标签: c++ global-variables local-variables


【解决方案1】:

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

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

【讨论】:

  • 嘿@R Sahu 很抱歉提出这种愚蠢的问题,但请原谅我,我只是想问一下,有什么办法可以通过外部存储类来完成?提前道歉。
  • "该语言没有提供区分 main 中的第一个 var 和第二个 var 的方法。"是不正确的。但是,如果您说,该语言没有提供...的范围解析设备,那将是正确的。也就是说,可以简单地引入一个额外的名称。
【解决方案2】:

您无法访问其范围之外的变量(在某些情况下,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 中。

【讨论】:

  • 使用命名空间怎么样?
  • 问题不在于“[使用] 变量 var(在最里面的块内声明)在其范围之外”。所以这没有回答问题。它应该是评论或答案的一部分。
【解决方案3】:

案例一

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

【讨论】:

  • 对不起,正确的答案是“没有办法做到这一点。”我也想在提及范围内使用var 和 20 ‌‌ 值。
  • 它的好友@hassanpanahi 你也知道不可能按照下面的答案来获取值或使用 goto 语句从你想要的任何地方跳出语句,但这没有意义你知道那个。
【解决方案4】:

关于您的示例代码

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

【讨论】:

    猜你喜欢
    • 2017-12-22
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2020-09-30
    • 2020-04-03
    • 2016-11-13
    • 2013-12-25
    相关资源
    最近更新 更多