Undeclared变量在Visual C ++中未标记为错误

时间:2017-11-06 22:56:23

标签: c++ visual-studio

我有一些旧的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()方法更改为返回迭代器而不是指针。因此,该问题在所有三次出现时都被正确标记为错误。

1 个答案:

答案 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编译器选项。