当前位置:首页 » 软件开发
开发技术指南» 文章正文
    引言: C++和异常 再回头来说我们在第一节里说到的 EXCEPTION_REGISTRATION结构,这个结构是用来注册操作系统的异常回调函数的,当异常发生时,该函数将被调用。
 

 

    摘要: 对于初学c/c++的人,我建议最好在使用dos 环境下的编译器,这样不至于在gui的环境(比如vc、bcb)里给弄糊涂了。那么在dos环境下如何使用c/c++的编译器了,其实很简单,下面用vc为例; 首先你告诉lib和include在什么地方,在就告诉编译的程序在什么地方,这样我们可以在任何目录下都可以使用编译器,要作到上面的,就理所当然要设定path了!设定如下: 假定你的vc安装......
 ·vc编程中常用快捷键    »显示摘要«
    摘要: 在平时的编程中,熟悉快捷键是个能提高效率的方法,本文章将陆续贴出关于快捷键的使用:ctrl+ins 拷贝 ctrl+c 拷贝 shift+del 剪切 ctrl+x 剪切 shift+ins 粘贴 ctrl+v 粘贴 ctrl+f 查找 ctrl+h 替换 ctrl+l 删除一行 alt+f2 编辑和修改书签(永久书签) ctrl+f2 编辑和修改书......


C++编译器怎么实现异常处理3

c++与异常

vc++扩展了异常回调函数得语法,增加了两个新的参数: 【程序编程相关:过滤钩子驱动程序(2)

再回头来说我们在第一节里说到的 exception_registration结构,这个结构是用来注册操作系统的异常回调函数的,当异常发生时,该函数将被调用. 【推荐阅读:MFC技术内幕系列之(二)---MFC文

{ 【扩展信息:再说我们的CPU

struct exception_registration

   exception_registration *prev;

   dword handler;

   int   id;

   dword ebp;

};

vc ++里,除了一些例外,在每个函数的头部生成exception_registration结构的局部变量(作者注:编译器可能在一个函数里根本不生成任何异常相关的代码,如果函数里没有try或者所有的局部对象都没有可供调用的析构函数(译注:当异常产生时,要把堆栈顶到catch到异常那点之间的局部变量都释放掉,这是异常处理一个重要责任.如果这些局部变量都不需要去特别释放,比如int变量或简单结构变量,只要把堆栈指针指过来就可以了,异常处理在这一段里就是没有必要的,因此编译器识别了这样的情况,作个一定的优化)).上面结构的ebp与前面说的堆栈帧里的ebp指针是重叠在一起的(译注:请参看c++编译器怎么实现异常处理2),函数在开始时把这个结构创建在它的堆栈上,同时把这个结构注册到操作系统(译注:就是把fs:[0]的位置改成这个结构的指针);在函数的结尾恢复调用者在系统注册的exception_registration结构(译注:就是把fs:[0]改成结构里的prev),我将在下一节讨论exception_registration结构里的id域的重要性.

当vc++编译一个函数,它生成函数的两套数据:

a) 异常的回调函数

b) 一个包含重要信息的数据结构,这些重要信息比如,各个catch块,它们的地址,关心的异常的种类等等,我将在下一节更多的谈论它

图  4 显示了如果考虑异常处理,程序运行时堆栈的情况.
...   下一页
 ·example: how to packetize a tcp stream    »显示摘要«
    摘要: the following example code is designed to replace the recv() call. recv_packet() differs by returning only when it has received a full packet, or has failed trying. this is only example code, for edu......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE