(3)结构化异常和C++异常
还有一个更隐蔽的差异存在于异常处理。Visual C++并不遵循异常处理的C++规范。考察如下的程序段:
#include
int main()
{
int* p = NULL;
try
{
*p = 0;
}
catch (...)
{
printf("caught the exception\n");
return 1;
}
return 0;
}
读者可以自己用 Visual C++ 2003和GCC分别检验这段程序。前者生成的程序在Windows上正常运行,输出caught the exception,然后正常退出。而GCC生成的程序只是输出Segmentation fault。所以在Windows上,catch语句抓住了一个异常。按照C++的标准,只有使用throw语句,才能产生异常。但是在上面的程序段中, 只是一个简单的赋值语句。原因在于,Visual C++ 2003将C++的异常处理映射成了Windows的结构化异常处理。在上面的语句中,*p = 0将引起一个Windows的异常,Visual C++将它处理成一个C++异常,并进入catch块。在Linux上,由于没有C++异常发生,程序直接崩溃。
Windows与Linux编译器的区别(4)
内容版权声明:除非注明,否则皆为本站原创文章。