for初始语句中声明变量的作用域问题
2006-02-28 13:29
537 查看
[论坛链接]
在for的初始语句中声明的变量,按C++98标准的规定,有效期仅为for循环中,详见ISO-IEC14882:
6.5.3 The for statement [stmt.for]
3 If the for-init-statement is a declaration, the scope of the name(s) declared extends to the end of the for-statement.
[Example:
int i = 42;
int a[10];
for (int i = 0; i < 10; i++)
a[i] = i;
int j = i; // j = 42
—end example]
而VC6中,其作用范围是for所在的作用域内;在VC7中, 作用域为定义起到下次定义为止。
按照MSDN的说法,可以设置/Zc:forScope选项来使VC遵循for 循环的标准C++ 行为:
--------------------
标准行为是使 for 循环的初始值设定项在 for 循环之后超出范围。在 /Ze 下,for 循环的初始值设定项保持在范围内,直到局部范围结束。
下列代码将在 /Ze 下编译,但不在 /Za 下编译:
int main() {
// int i;
{
for (int i =0; i < 1; i++)
;
i = 20; // i has already gone out of scope under /Za
}
}
使用 /Zc:forScope 时,如果变量因为存在一个在以前的范围内所做的声明而处在范围内,则将得到警告。为了说明这点,请移除上面代码中的 // 字符以声明 int i。
在 Visual Studio 开发环境中设置此编译器选项
打开此项目的“属性页”对话框。有关详细信息,请参见设置 Visual C++ 项目属性。
1。单击“C/C++”文件夹。
2。单击“语言”属性页。
3。修改“强制 For 循环范围中的一致性”属性。
或者可以改变代码,避免这个问题。解决方法:
1 加上 #define for if(0) ; else for
2 附加一对花括号可以使代码在 C/C++和 VC6 环境都兼容。
{
for ( int i = 0; i<10; i++) {;
}
}
在for的初始语句中声明的变量,按C++98标准的规定,有效期仅为for循环中,详见ISO-IEC14882:
6.5.3 The for statement [stmt.for]
3 If the for-init-statement is a declaration, the scope of the name(s) declared extends to the end of the for-statement.
[Example:
int i = 42;
int a[10];
for (int i = 0; i < 10; i++)
a[i] = i;
int j = i; // j = 42
—end example]
而VC6中,其作用范围是for所在的作用域内;在VC7中, 作用域为定义起到下次定义为止。
按照MSDN的说法,可以设置/Zc:forScope选项来使VC遵循for 循环的标准C++ 行为:
--------------------
标准行为是使 for 循环的初始值设定项在 for 循环之后超出范围。在 /Ze 下,for 循环的初始值设定项保持在范围内,直到局部范围结束。
下列代码将在 /Ze 下编译,但不在 /Za 下编译:
int main() {
// int i;
{
for (int i =0; i < 1; i++)
;
i = 20; // i has already gone out of scope under /Za
}
}
使用 /Zc:forScope 时,如果变量因为存在一个在以前的范围内所做的声明而处在范围内,则将得到警告。为了说明这点,请移除上面代码中的 // 字符以声明 int i。
在 Visual Studio 开发环境中设置此编译器选项
打开此项目的“属性页”对话框。有关详细信息,请参见设置 Visual C++ 项目属性。
1。单击“C/C++”文件夹。
2。单击“语言”属性页。
3。修改“强制 For 循环范围中的一致性”属性。
或者可以改变代码,避免这个问题。解决方法:
1 加上 #define for if(0) ; else for
2 附加一对花括号可以使代码在 C/C++和 VC6 环境都兼容。
{
for ( int i = 0; i<10; i++) {;
}
}
相关文章推荐
- 对Visual C++中for语句中初始化部分声明的变量的作用域存在的问题
- gcc c 在for语句中声明变量需要编译时加“-std=c99”
- vc6.0中for语句变量重定义问题解决办法
- for循环中声明变量的一个问题回顾
- switch语句中在case块里声明变量会遇到提示“Expected expression before..."的问题
- switch语句中在case块里声明变量会遇到提示“Expected expression before..."的问题
- 批处理问题:SET 命令在 FOR 循环中失效 / SET 环境变量生存域/作用域
- if语句中变量作用域问题
- switch语句中在case块里声明变量会遇到提示“Expected expression before..."的问题
- switch语句中在case块里声明变量会遇到提示“Expected expression before..."的问题
- switch语句中在case块里声明变量会遇到提示“Expected expression before..."的问题
- linux shell 的变量问题 &&export 语句作用 &&su 与 su - 的区别
- C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?
- C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?
- 不允许一个变量声明语句作为一条语句在for、while 或do中
- 关于一个STM32编译报错问题,变量声明不能在语句后面
- C语言中对于for语句,变量赋初值问题探讨
- 读书笔记之 将所有增强for语句的循环变量声明为final类型
- php foreach行声明变量的作用范围问题
- switch语句中在case块里声明变量会遇到提示“Expected expression before..."的问题