在Visual C++中,未声明的变量未标记为错误
Undeclared variable not flagged as error in Visual C++
我有一些旧的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编译器选项。
相关文章:
- 在将变量声明为引用时,堆在释放后使用
- 如何在 c++ 中让布尔变量返回为 0 或 1 而不是真或假?
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 变量始终为空
- 将双精度变量设置为另一个变量的值
- 将变量替换为可变参数模板
- 如何检查模板类中的变量是否为字符串类型?
- 如何将变量存储为无
- 是否可以将已经初始化的变量转换为 void*?
- C++多线程程序:变量定义为类成员的隔离错误
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- 关于读取有效 c++ 第 4 项(将非局部静态变量替换为局部静态变量)的问题
- 为什么 std::move 不将默认移动构造函数中的源变量更改为默认值?
- 将变量设置为类型模板
- 将变量定义为静态时,为什么可以多次定义它
- fstream库,试图创建一个变量名为(c++)的文件
- 将变量声明为全局变量,然后声明为局部变量 -Shadowing-
- 在 c++ 中将多个变量设置为相同的值
- 我是否必须在类中的所有变量C++设置为 private?
- 如果静态变量只为程序的整个部分存储了一个副本,为什么我不能使用静态变量交换 2 个数字?