Visual C++6可变范围错误

Visual C++ 6 Variable Scope Bug

本文关键字:范围 错误 C++6 Visual      更新时间:2023-10-16

所以我继承了一些和我一样老的代码,我的任务是维护它。这些代码是用Visual C++6编写的,所以无论如何想象都不是现代的。

无论如何,我决定尝试升级该解决方案(或者我猜微软当时称之为工作区),这样我就可以在Visual Studio 2013中使用它,并使用一个有点现代的IDE(我想我更喜欢使用Emacs或普通的旧记事本,而不是VC++6)。在更改了MFC库的字符集之后,我得到了一大堆undeclared identifier错误(大约1100个错误)。其中很多似乎源于一个临时的变量范围问题,这让我想知道以前到底是如何允许编译这些代码的。我看到很多这样的东西:

void MyClass::MyFunc() 
{
    for(int i=0;i<56;i++)
    {
      // do some stuff
    } 
    // command hardware
    for(i=0;i<m_pinfo->vc_num;i++)
    {
      // do some more stuff
    }
}

神奇的是,这段代码在VC++6中编译得很好,但(谢天谢地)在VS2013中没有。注意变量i是如何在第一个for循环的范围内声明的,但随后在第二个for循环中再次使用。这种代码在整个程序中随处可见。

使用VC++6的Goto Definition工具,它告诉我变量i(但它仍然可以编译!)和几个看似不相关的变量和参数"i"之间存在歧义,这些变量和参数都在单独的.cpp文件中,其中一些甚至在结构中定义。

这里可能发生了什么?出于所有的意图和目的,我看不出如何允许在VC++6中编译这些代码。

它是MSVC++6中的一个扩展。根据标准,在for循环范围之外,不能访问在for循环中声明的变量。如果你需要在MSVS的新版本中获得这种非标准行为,那么你可以启用/Zc:forScope标志

我建议你修复for循环,这样你就有了标准的一致性代码。这样,不知道这个扩展存在的人就不会对代码感到惊讶。

在旧C中,您可以定义int,而不必指定其类型。我怀疑VC++6遵守了这个古老的规则,并为第二个循环隐式地定义了一个新的i变量。

如果我是对的,这也应该编译:

void MyClass::MyFunc() 
{
    for(i=0;i<56;i++)
    {
      // do some stuff
    } 
    // command hardware
    for(i=0;i<m_pinfo->vc_num;i++)
    {
      // do some more stuff
    }
}

这应该打印1 2 3 4

void MyClass::MyFunc() 
{
    for(i=1;i<3;i++)
    {
      std::cout << i << ' ';
    } 
    // command hardware
    for(;i<5;i++)
    {
      std::cout << i << ' ';
    }
}