Variable Shadowing,直接翻译叫做变量影子,好像有点懵,下面用例子来看下这是什么意思。
一 求和例子
下面是个简单的求和代码,计算0~upper的数字相加和,
#include <cstdio>
int main(void)
{
int sum = 0;
int upper = 100;
for (int i = 0; i != upper; ++i)
{
sum += i;
}
printf("sum: %d\n", sum);
return 0;
}
编译ok,输出如下,
在for循环的循环体里对sum求和。假如我们在for循环里又定义了sum变量,如下,
#include <cstdio>
int main(void)
{
int sum = 0;
int upper = 100;
for (int i = 0; i != upper; ++i)
{
int sum = 0;
sum += i;
}
printf("sum: %d\n", sum);
return 0;
}
根据C++语言的定义,在for循环的作用域里定义的sum变量会隐藏掉作用域外定义的同名sum变量,这样在for循环里对sum求和,对外面的sum不会产生任何影响,这个就叫做Variable Shadowing,我们可以这么说:for循环里定义的sum变量shadowing了外部定义的sum变量。
从这一点来看,这个Variable Shadowing应该翻译为变量隐藏更合适一点。
二 分析
这样写代码一般我们编译不会报任何warning或者error,但是这种情况有时并不是我们想要的,可能是自己笔误写的,一般来说,大家不会在一个作用域里定义多个相同名字的变量,即使他们互不干扰,这是比较好的代码风格。
如何在编译时把这种情况以warning的形式提示出来呢?这就需要在编译时加上-Wshadow的编译选项,本人用的是code blocks,在build option里就直接勾上就行了。
再编译,就会有warning提示,
有了warning提示,我们就会去检查代码,看是否有问题。
三 总结
本文是看了《C++ Weekly -Ep 167》的视频然后简单总结的。如果有写的不对的地方,请留言指正,谢谢。