Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
软件频道>IT教育>IT培训辅导名校展台精品课程培训机构登录|软件频道产品中心群乐软件下载<群乐:Vista系统
您现在的位置: 天极网 > 软件频道 > IT教育频道 > 培训辅导 > C++中如何兼容并支持C中提供的异常处理机制
全文

C++中如何兼容并支持C中提供的异常处理机制

2005-08-08 15:24 作者: 王胜祥 出处: csai.cn 责任编辑:王玉涵
    C语言中提供的异常处理机制并不是十分严谨,而且比较复杂,功能也非常有限。最常见的除了setjmp与longjmp之外,goto语句在实际编程中也使用很广泛(虽然不建议使用它)。大家现在也都知道,在C++语言中,它并不完全兼容并支持setjmp与longjmp函数的使用。但是C++语言对待goto语句又将如何呢?

C++语言中如何处理goto语句

  大家知道,在C语言程序中,goto语句被编译成机器指令后,它只对应一条jmp指令。但是在C++语言程序中,goto语句也会这么简单吗?no!为什么这么说呢?因为C++语言是面向对象的语言,如果goto语句只会简单地对应一条jmp指令,那么在许多情况下,这会破坏面向对象的一些特性。例如下面的示例程序,代码如下:

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>

class MyTest
{
public:
MyTest ()
{
printf("构造一个MyTest类型的对象\n");
}

virtual ~ MyTest ()
{
printf("析构销毁一个MyTest类型的对象\n");
}
};

void main( void )
{
MyTest myobj0;
{
int error;
MyTest myobj1;
MyTest myobj2;
MyTest myobj3;

error = 1;

// 注意下面这条goto语句,如果它只是一条简单的jmp指令,
// 那么myobj1,myobj2,myobj3对象将如何被析构销毁呢?
if(error) goto Error;

printf("no error, continue\n");
}

Error:
return;
}

  请编译运行一下,程序的运行结果如下:
  构造一个MyTest类型的对象
  构造一个MyTest类型的对象
  构造一个MyTest类型的对象
  构造一个MyTest类型的对象
  析构销毁一个MyTest类型的对象
  析构销毁一个MyTest类型的对象
  析构销毁一个MyTest类型的对象
  析构销毁一个MyTest类型的对象

  呵呵!从程序的运行结果来看,显然,它符合面向对象的规则定义,“一个对象被构造了,就必然会有析构的过程”。所以说,在C++语言中,它是能够很好兼容并支持goto语句的语义,这也与C++是C语言的继承、扩充、完善的版本等承诺是相一致的。但是同时我们也知道,C++中对象的析构,是由编译器来予以支持的,那就是当编译器在编译程序时,如果局部对象在离开它的作用域时,编译器会显式地插入一些调用对象析构函数的代码,来销毁这些即将无效掉的局部对象。但是程序中如果遭遇到goto语句时,显然,编译器也需要插入对局部对象的析构函数的显式调用。请在上面的程序中goto语句那一行,按F9设置一个断点;然后F5,调试程序;接着Alt+8切换到汇编代码的显示状态下,注意查看if(error) goto Error语句对应的汇编程序。截图如下:

共2页。 1 2 :
网友关注
最新上市
编辑推荐
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml