这段代码说明了一些我认为应该被视为不好的做法,并引发编译器关于重新定义或屏蔽变量的警告:
#include <iostream>
int *a;
int* f()
{
int *a = new int;
return a;
}
int main()
{
std::cout << a << std::endl << f() << std::endl;
return 0;
}
它的输出(用 g++ 编译):
0
0x602010
我查看了一些参考资料(Stroustrup 和 The Complete C++ Reference),但找不到任何关于何时以及为何允许这样做的信息。不过,我知道它不在一个本地范围内。
何时以及为何允许这样做?这个结构有什么好的用途吗?我怎样才能让 g++ 警告我呢?其他编译器是否对此大喊大叫?