为什么这个循环变量可访问外循环范围?

时间:2018-04-11 08:29:03

标签: c++ visual-studio

在浏览一些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'未定义。

发生了什么事?这对于编译器错误来说太基础了。如果父作用域中有另一个{{1}},则不会出现编译错误。我错过了什么吗?我正在使用Visual Studio 2015。

1 个答案:

答案 0 :(得分:9)

过去的Visual Studio具有延长使用寿命的功能。在@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_CODE_LOCATION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { setUserLocation(); } else { toast(getApplicationContext(),"You have cancelled location accessed request"); currentLoaction.setImageDrawable(getResources().getDrawable(R.drawable.location)); } } } 标准出现之前,for(...)构造中声明的变量的可访问性(来自普通C行为的保留)。默认情况下,在旧项目中启用了此行为。

Microsoft意识到这种(针对C ++)非标准符合性行为可能是不合需要的,并且提供了C++98编译器选项来控制此行为(最近默认启用此开关,恢复标准C ++一致性)。 / p>

检查/Zc:forScope下的项目设置中是否设置了/Zc:forScope - &gt; C++骑手如果没有,请设置它。

注意:您还可以选择在那里设置Language以明确启用非标准行为,以防您拥有依赖它的遗留代码。