【发布时间】:2018-09-21 01:12:16
【问题描述】:
在浏览一些 C++ 代码时,我遇到了以下几行:
for (int i = 0; i < count; i++) {
if (&array[i].GetData() == el)
break;
}
if (i < count) {
// .. Do something
}
我很惊讶地看到循环计数器变量i 可以在循环外访问!
为了确保循环外的i与循环内的相同,我将循环变量名改为i1。
for (int i1 = 0; i1 < count; i1++) {
if (&array[i1].GetData() == el)
break;
}
if (i < count) { // COMPILATION ERROR: Identifier i is undefined
// .. Do something
}
这导致if(i < count) 行出现编译错误:
标识符“i”未定义。
发生了什么事?这太基本了,不能成为编译器错误。如果父作用域中有另一个i,则不会出现编译错误。我错过了什么吗?我正在使用 Visual Studio 2015。
【问题讨论】:
-
你使用什么编译标志? (例如:您是否打开了
/permissive和/或/Za?) -
看起来像是这里描述的东西的痕迹stackoverflow.com/questions/49447957/…
-
这是微软编译器的“扩展”。由于历史原因,它默认启用。
-
您是否设置了
/Zc:forScope-(IDE 的 C++ 属性中的“强制 For 循环范围内的一致性”)选项?这会导致 MC++ 2015 编译器使用扩展for循环变量范围的遗留行为。 -
这绝对不是标准行为,你绝对不应该指望它。您当前标志的编译器可能会接受这一点,但另一个编译器,甚至只是具有相同编译器的不同版本或标志,可能不会(老实说,imo 不应该)
标签: c++ visual-studio