gpt4 book ai didi

c++ - 访问由 C++ 中的局部声明隐藏的封闭范围(非全局)中的变量?

转载 作者:可可西里 更新时间:2023-11-01 18:36:30 25 4
gpt4 key购买 nike

作用域解析运算符:: 可用于访问被局部声明遮蔽的全局变量。对于在封闭范围内而非全局范围内声明的变量,您如何实现相同的效果?

int main() {
int i = 10;

if (1) {
int i = 5;
std::cout << "Local i: " << i << std::endl;

std::cout << "Main's i: " << ?? << std::endl; //How to access main's i?
}

return 0;
}

我知道这是不好的做法。但我只是想知道这是否可能。我认为不是。

解释为什么这是不可能的或如何是有用的。

最佳答案

不幸的是,这是不可能的。编译器警告选项(如 GCC 的 -Wshadow)有助于避免此类情况:

-Wshadow

Warn whenever a local variable or type declaration shadows another variable, parameter, type, class member (in C++), or instance variable (in Objective-C) or whenever a built-in function is shadowed. Note that in C++, the compiler warns if a local variable shadows an explicit typedef, but not if it shadows a struct/class/enum. Same as -Wshadow=global.

your example ,例如,您会收到如下警告:

: In function 'int main()':

:7:9: error: declaration of 'i' shadows a previous local [-Werror=shadow]

7 |     int i = 5;

|

作为@L. F.在下面的评论中指出,您可以使用引用来访问其他 i:

#include <iostream>

int main() {
int i = 10;
if (1) {
int& nonlocal_i = i; // just before shadowing
int i = 5;
std::cout << "Local i: " << i << std::endl;
std::cout << "Main's i: " << nonlocal_i << std::endl;
}
return 0;
}

但是 -Wshadow 仍然会报错,如果您要加倍努力寻找替代名称,您可以将本地 i 命名为不同的名称。


注意:作为user4581301在评论中指出,像 int& i = i; 这样的代码不会在内部范围内执行您期望的操作:

#include <iostream>

int main()
{
int i = 4;
{
int& i = i;
std::cout << i;
}
}

它尝试使用变量i 来初始化自己。在 Microsoft 的编译器中,您会遇到如下编译错误:

error C4700: uninitialized local variable 'i' used

在 GCC 中,如果您打开所有警告,您会收到此消息:

error: reference 'i' is initialized with itself [-Werror=init-self]

但如果您没有打开警告,它会默默地编译并做错事

关于c++ - 访问由 C++ 中的局部声明隐藏的封闭范围(非全局)中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56783612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com