对于自己的花括号内的循环

Ed *_*man 117 c++ scope for-loop

我遇到过这种for循环布局:

#include <iostream>
int main()
{
    {
        for (int i = 0; i != 10; ++i)
        {
            std::cout << "delete i->second;" << std::endl;
        }
    }

    {
        for (size_t i = 0; i < 20; ++i)
        {
            std::cout << "delete m_indices[i];" << std::endl;
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想知道这个额外的支撑层是什么用的?这在我们的代码库中出现了几次.

UKM*_*key 286

曾几何时,很多时候,VS6已经存在并且很受欢迎.然而,它未能符合许多C++标准; 当标准正式发布之前(同年)发布时,这是合理的; 但据我所知,它确实遵守了标准草案.

草案与官方标准之间发生变化的标准之一是第一部分中创建的for循环变量的生命周期; 导致以下代码无法编译

{
    for (int i=0; i<1; ++i){}
    for (int i=0; i<2; ++i){}
}
Run Code Online (Sandbox Code Playgroud)

因为i第二个for循环重新定义了.

而其他编译器也遇到了这个错误; 我强调了VS6的一个,因为它在标准发布后的若干年中仍然是唯一的Visual Studio版本,但从未发布过针对此特定问题的更新; 意味着它产生了更重大的影响.

对此的解决方案是强制整个for循环进入其自己的范围,如您所示.

  • 无需找到VS6来查看@bolov,在VS2015中将"For Loop Scope中的强制一致性"设置为"否",并享受;-) (49认同)
  • 版本2.7之前的GCC也表现出这种行为.请参阅https://docs.freebsd.org/info/g++FAQ/g++FAQ.info.for_scope.html (7认同)
  • 将此归因于旧的Microsoft编译器的错误是虚假的.这种行为实际上是草案C++标准的一个特性,许多编译器都这样做(不仅仅是Microsoft编译器).从记忆中,它在大约1995年的草案中被改变,使变量本地化为循环 - 大约在批准第一个C++标准之前三年.所以大多数C++编译器早于1996年以这种方式工作. (7认同)
  • @alain"选项'Zc:forScope-'已被弃用,将在未来版本中删除"并编译没有问题...我很伤心 (5认同)
  • @Damon不是VS6首次发布的时候; 但是,当标准发生变化时,从未发布符合这些标准的更新.标准改变后,VS6在流行的几年里依然流行. (5认同)
  • 它绝对不仅仅是VS6,我还记得在拥有这个版本的日子里使用赛门铁克编译器.所以我们已经有了VS6,GCC和赛门铁克 - 听起来像这种行为曾经**真的很受欢迎...... (5认同)
  • @UKMonkey ISO/IEC 14882:1998是在VS6之后发布的,所以这并不是一个问题,标准已经变得如此之多,以至于之前没有真正的C++标准,只是或多或少的兼容实现. (4认同)
  • @Cubic - 但是在第一个标准发布之前的几年,就有了委员会草案.并且,在实施时,VS6 for循环符合这些草稿.然后发生了什么. (3认同)
  • +1,但我认为答案应该真正指出,表现得那么好.在目前的形式中,它表明这是一个不是这样的错误 (3认同)
  • @LightnessRacesinOrbit"这样的古董代码"?"古董"代码无处不在,应该如此.开发人员的心态应该是他的代码要存在很长时间.我们可以解雇我们公司的一个开发人员,因为他无法摆脱他所有工作中"快速和暂时"的心态.人类DNA的共同部分比VS6更老,但它的执行(在同样古老的硬件上,即核糖体)产生我们每天需要生存的蛋白质.也许你会乐意放弃那些代码,因为它真的**真的很"古老"(比VS6年龄大),对你自己有致命的结果? (3认同)

cok*_*ken 15

{并且}将创建一个范围,如果在范围定义一些变量,你不能从外部访问它们.但for已经创造了这个范围.所以

{for(int i = 0; i < count; ++i){}} 
Run Code Online (Sandbox Code Playgroud)

是相同的

for(int i = 0; i < count; ++i){}
Run Code Online (Sandbox Code Playgroud)

但如果你在它们之间定义一些东西,那就有区别了

{int a = 0; for(int i = 0; i < count; ++i){}}
Run Code Online (Sandbox Code Playgroud)

在此示例中,a将无法从外部范围访问.