Visual C++6可变范围错误
Visual C++ 6 Variable Scope Bug
所以我继承了一些和我一样老的代码,我的任务是维护它。这些代码是用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 << ' ';
}
}
- "myClock"未在此范围错误中声明
- 包含来自另一个文件的函数会导致范围错误(openFoam)
- Visual C:命名空间范围错误或晦涩功能?
- 在遍历字符串时,为什么我没有超出范围错误,即使我已经超出了它的长度?
- 此范围错误中未声明如何修复
- 尝试声明函数的局部变量,但得到范围错误
- c ++ to_string未在此范围错误 [Windows + Devcpp 环境] 中声明
- 将文件读取到向量的向量,超出范围错误
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- Eratosthenes C 的筛子 - 内存处的范围错误
- 向量:内存处的范围错误
- 测试完美哈希函数时超出范围错误
- 为什么此代码会给出 Vector 超出范围错误
- 在填充 Arduino 草图时出现范围错误
- 如何修复C++中矢量的"下标超出范围"错误?
- CPP-模板范围错误
- 在此范围错误中未声明函数错误
- C 表达式:向量下标出范围错误线:1733
- 无法在好友函数中实例化类?我没有得到在范围错误中声明
- 带有类的嵌套结构.范围错误