Ada*_*non 17 c++ windows 64-bit exception visual-c++
我正在用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;
}
Run Code Online (Sandbox Code Playgroud)
(我很快就会解释这if (1==0)条款)
使用MSVC for x86编译此代码时(我使用过2010),结果如预期:
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
...
Run Code Online (Sandbox Code Playgroud)
等等,在无限循环中.
但是,为x64编译此代码会导致:
Throwing
Catch 2
Done
Run Code Online (Sandbox Code Playgroud)
该异常完全跳过内部catch子句!
只有if (1 ==0)在我的代码中存在子句时才会发生这种情况.当我删除它时,异常会按预期在"Catch 1"中捕获.
我尝试过使用其他编译器:
我的问题:这是一个MSVC错误,还是这个C++中的一些未定义的行为我错过了?如果这确实是一个MSVC错误,我很想听听有关原因的一些见解.
谢谢.
小智 0
尝试开关 /FAs 开关:
http://msdn.microsoft.com/en-us/library/367y26c6%28v=vs.80%29.ASPX
“编译器设置”中“附加输出文件”中的某个位置。(确保所有其他设置都相同)
然后,对两个输出进行比较。在这里发布差异。我确信有些人能够告诉您原因和方式,也许还有一些编译器设置或代码解决方法。