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 ++警告我呢?其他编译器是否会喋喋不休?
这是完全有效的,但我认为-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.
这是允许的,这样您就可以安全地忽略全局标识符覆盖.从本质上讲,您只需要关注实际使用的全局名称.
假设,在您的示例中,f()首先定义了.然后其他一些开发者添加了全局声明.通过添加f()以前工作的名称仍然有效.如果覆盖是一个错误,那么该函数将突然停止工作,即使它对新添加的全局变量没有任何作用.