在Visual C++中,未声明的变量未标记为错误

Undeclared variable not flagged as error in Visual C++

本文关键字:变量 记为 错误 未声明 Visual C++      更新时间:2023-10-16

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

Visual C++6于1998年发布,它没有(也不可能)完全符合同年的C++98标准。在for循环init语句中声明的变量可以在循环之外访问。

for (int i = 0; i < n; ++i) {
...
} 

与相同

int i;
for (i = 0; i < n; ++i) {
...
} 

当时有一个相当常见的宏来阻止这种行为:

#define for if(0); else for

如果您在VS2003中仍然有这种行为,请查看/Zc:forScope编译器选项。