我继承了一些代码,我将对其进行重构,这些代码在不同范围内广泛使用具有相同名称的多个变量,即:
int test = 456;
int main(void) {
int test = 0;
//...
for (i=0; i<MAX_VAL; i++) {
int test = 123;
//...
}
return 0;
}
我知道如果相同的变量名仅在两个相关级别的范围内使用,我可以通过声明来访问全局可访问的extern int test在更深/更低层次的范围内。虽然有两个以上的级别,但我不确定哪个test
正在访问变量:全局范围变量或更高一级范围的变量。
我决定重新编写代码以使用不同的变量名称,并在此过程中发现了许多过去难以跟踪的错误。当使用这种行为时,有没有办法触发警告?我必须在 Linux 中通过 GCC 编译代码,在 Windows 中通过 Visual Studio 2010 编译代码。如果不可能采用可移植的方法,那么每个编译器是否有办法对不同范围内具有相同名称的多个变量发出警告?这将使我能够构建代码并获得使用此类行为的所有位置的列表。
谢谢。
gcc 和 clang 都支持-Wshadow
警告变量相互影响的标志:
-Wshadow
每当局部变量或类型声明隐藏另一个变量、参数、类型、类成员(在 C++ 中)或实例变量(在 Objective-C 中)或每当内置函数被隐藏时发出警告。请注意,在 C++ 中,如果局部变量隐藏显式变量,编译器会发出警告typedef
,但如果它遮蔽了 astruct
/class
/enum
.
来自 Visual Studio 2015默认情况下您会收到警告:
阴影变量
如果封闭范围已包含同名变量,则变量声明“隐藏”另一个变量声明。例如:
void f(int x)
{
int y;
{
char x; //C4457
char y; //C4456
}
}
x 的内部声明隐藏了函数 f 的参数,因此编译器将发出:
警告 C4457:“x”的声明隐藏了函数参数
y 的内部声明隐藏了函数作用域中 y 的声明,因此编译器将发出:
警告 C4456:“y”的声明隐藏了先前的本地声明
请注意,与之前一样,与函数参数同名但未包含在内部作用域中的变量声明会触发错误:
void f(int x)
{
char x; //C2082
}
编译器发出:
错误 C2082:重新定义形式参数“x”
对于旧版本的 Visual Studio,您可以启用代码分析 (see 如何在 MSVC++ 中启用 6000 系列警告(代码分析警告)?)并查看警告C6244 and C6246.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)