我有一些旧的C ++代码,我试图将其带到更现代的时代。在这个阶段,我试图获得使用Visual C ++ 6.0编译的代码,现在使用VS 2003进行编译(Microsoft Visual C ++ .NET 69462-335-0000007-18915)。如果我们能够干净利落地进行编译如果运行正常,那么我们可以采取另一个步骤将其纳入更新版本的VS.
但是我发现了一个未被C ++编译器标记的未声明变量的情况!代码是这样的:
for (MLink *ML = m_Links.begin(); ML != m_Links.end(); ++ML)
{
// some code here
}
for (std::map<CString,int>::iterator it = Rows.begin();
it != Rows.end(); ++it)
{
MLink *ML = std::find (m_Links.begin(), m_Links.end(), Type);
// more code here
}
ML = m_Links.begin();
在第一个for循环中,ML被定义为循环语句中的指针。我理解这意味着ML在循环之外未定义。
在第二个for循环中,ML被定义为循环代码块中的指针。同样,我理解这意味着ML在循环之外未定义。
但是最后一行引用了ML而没有声明它的类型,编译器没有给出任何错误(甚至是警告)。怎么会这样???
注意:m_Links变量是一个向量,并且标准库中的begin()方法更改为返回迭代器而不是指针。因此,该问题在所有三次出现时都被正确标记为错误。
答案 0 :(得分:2)
Visual C ++ 6于1998年发布,它不是(也不可能)完全符合同年的C ++ 98标准。在for循环中声明的变量可以在循环外部访问。
for (int i = 0; i < n; ++i) {
...
}
与
相同int i;
for (i = 0; i < n; ++i) {
...
}
那些日子有一个相当常见的宏来阻止这种行为:
#define for if(0); else for
如果在VS 2003中仍然有此行为,请查看/Zc:forScope编译器选项。