-
根据C++的标准,在for语句中定义的变量,其作用域仅限于for语句内,但是VC6.0中的for语句不符合标准。
-
for(int i = 0; i<5; ++i)
-
{
-
}
-
//i在此处仍然有效
-
可以通过如下的宏定义去掉VC6中for的不符合标准的成分:
-
#define for if (0); else for
-
因为加了上述的宏定义之后,前面的for语句展开为:
-
if(0)
-
;
-
else
-
for(int i = 0; i<5; ++i)
-
{
-
}
-
//此处已经超出else的作用域范围,在else语句中定义的i无效
-
有人会说,那定义为如下定义是不是也可以呢?
-
#define for if(1) for
-
我们使用这个宏定义展开前面的for语句看看:
-
if(1)
-
for(int i = 0; i<5; ++i)
-
{
-
}
-
//此处i也同样超出了if语句的作用域,也将无效
-
但是,如果for语句是在if语句里的呢,例如:
-
if(a>b)
-
for(int i = 0; i<5; ++i)
-
{
-
dosomething(i);
-
}
-
else
-
{
-
doanotherthing();//希望在a<=b时执行
-
}
-
展开将得到:
-
if(a>b)
-
if(1)
-
for(int i = 0; i<5; ++i)
-
{
-
dosomething(i);
-
}
-
else
-
{
-
doanotherthing();//实际在a>b时也执行了
-
}
-
另外,如果程序中错误的出现
-
for(int i = 0; i < 5; ++i)
-
{
-
}
-
else
-
{
-
}
-
通过上述的宏定义展开,也将无错。
-
当然前一个问题可以通过好的编码习惯避免:给所有的if,else语句都加大括号,即使只有一条语句;而后一个问题可以通过仔细检查而避免。但是介于#define for if(1) for宏定义存在的隐患,
-
还是使用#define for if (0); else for最好。