在C++中,何时可以在同一范围内看到两个同名变量?

Phi*_*ler 6 c++ standards warnings compiler-warnings

这段代码说明了我认为应该被视为不良做法的内容,并引发编译器关于重新定义或屏蔽变量的警告:

#include <iostream>

int *a;

int* f()
{
  int *a = new int;
  return a;
}

int main()
{
  std::cout << a << std::endl << f() << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它的输出(用g ++编译):

0
0x602010
Run Code Online (Sandbox Code Playgroud)

我看了几个引用(Stroustrup和完整的C++参考),但找不到关于何时以及为什么允许这样做的任何内容.但我知道它不在一个局部范围内.

何时以及为何允许这样做?这个结构有用吗?我怎样才能让g ++警告我呢?其他编译器是否会喋喋不休?

Ree*_*sey 15

至于为什么允许这样做:这是完全有效的.

当你在f()函数中时,你正在定义一个局部范围.本地范围覆盖全局范围,因此定义"a"变量会"隐藏"全局范围int *a;


Tod*_*lin 9

这是完全有效的,但我认为-Wall只有你在阴影参数时才会收到警告.

如果在影响任何类型的变量时需要警告,可以在g++手册页中使用它:

   -Wshadow
       Warn whenever a local variable shadows another local variable, 
       parameter or global variable or whenever a built-in function is 
       shadowed.
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下-Wshadow不包含此内容-Wall.


Sin*_*ion 6

这是允许的,这样您就可以安全地忽略全局标识符覆盖.从本质上讲,您只需要关注实际使用的全局名称.

假设,在您的示例中,f()首先定义了.然后其他一些开发者添加了全局声明.通过添加f()以前工作的名称仍然有效.如果覆盖是一个错误,那么该函数将突然停止工作,即使它对新添加的全局变量没有任何作用.