C++处理for循环作用域,第1张

C++处理for循环作用域,第2张

在C++标准形成之前,在for循环中声明的变量也可以在循环外访问。示例:
for(int n = 0;n〈MAX;++n)
{
//..做点什么
}
++ n;//在预标准C++中OK;Illein在ISO C++中
然而,在ISO C++中,for循环变量的范围仅限于循环本身。虽然这一变化不可否认是重要的,但它影响了旧代码和新代码。下面我将演示一些迁移技术来帮助您处理这种变化。

遗留代码
对于在标准制定前使用范围规则的遗留代码,如果使用与标准兼容的编译器编译,可能会出现错误。解决这个问题的方法是修改代码。但是,代码修正需要彻底的测试,有时会导致一系列的缺陷和编译错误。
如果你不想处理这个难题,同时又想升级编译器,不妨查一下有没有办法恢复标准制定前for循环变量的行为。如果使用了这个变量,就打开这个选项,然后(带注释)在代码中把这个事实记清楚,这样以后的程序员就知道如何正确编译这段代码了。
如果你担心依赖编译器的青睐,有一个替代补丁:将变量的定义移到for循环之外:
如果你不想依赖编译器的帮助,那么还有一个替代方法:将变量的定义移到for循环之外:
int n = 0;//最初位于for循环
for (/*n在这里*/;n〈MAX;++n)
{
//..做点什么
}
int x = n;//OK
有改动的地方一定要加上描述性的注释。
范围规则也可能影响新代码。例如,假设我们需要使用一个在标准制定之前仍然保持行为的编译器来编译新代码。
为了确保for循环变量不会在循环外被访问,我们可以在整个循环外用一对花括号括起来。
{//限制for循环变量的作用域
(int n = 0;n〈MAX;++n)
{
//..做点什么
}
}//限制for-loop变量的作用域
借助条件编译,能否使用只在需要的时候插入arm的宏:
借助条件编译,我们可以用一个宏来控制只在需要的地方插入花括号:
# if defined(old _ FOR _ scoping)
# define OPEN _ FOR _ GUARD {
# define CLOSE _ FOR _ GUARD }
# else

OPEN _ FOR _ GUARD
FOR(int n = 0;n〈MAX;+n)
{
/..做点什么
}
close _ for _ guard
如果您使用的是新代码和与标准兼容的编译器,那么新的作用域规则不会导致任何问题。然而,对于遗留代码或旧编译器,您可以使用我在这篇技巧中描述的技术来解决这个问题。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++处理for循环作用域

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情