我正在用 C++ 编写一个程序。该程序在 Win32 (x86) 上运行良好,最近我尝试为 x64 本地编译它。当然,事情并没有立即奏效。
调试问题后,我设法用这个简单的代码片段重现了它:
class MyException { };
int main()
{
try {
for (;;) {
try {
std::cout << "Throwing" << std::endl;
throw MyException();
if (1 == 0) {
continue;
}
} catch (const MyException&) {
std::cout << "Catch 1" << std::endl;
}
}
} catch (const MyException&) {
std::cout << "Catch 2" << std::endl;
}
std::cout << "Done" << std::endl;
return 0;
}
(我很快就会解释这个if (1==0)
条款)
使用 MSVC for x86 编译此代码时(我使用的是 2010),结果如预期:
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
...
以此类推,无限循环。
但是,为 x64 编译此代码会导致:
Throwing
Catch 2
Done
异常完全跳过了内部的 catch 子句!
这只发生if (1 ==0)
在我的代码中存在该子句时。当我删除它时,异常会按预期在“Catch 1”中捕获。
我试过使用其他编译器:
- 这个错误也发生在 VS 2012 中。
- MinGW 和 MinGW-w64 按预期工作。
我的问题:这是一个 MSVC 错误,还是我缺少的 C++ 中的一些未定义行为?如果这确实是一个 MSVC 错误,我很想听听有关原因的一些见解。
谢谢。