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