91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++編譯器是怎樣實現異常處理

發布時間:2021-11-24 09:57:48 來源:億速云 閱讀:138 作者:柒染 欄目:編程語言

本篇文章為大家展示了C++編譯器是怎樣實現異常處理,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

由于C++編譯器裝程序太多,此處無法上傳,所以大家有communitysever的可以從里面獲得然后反編譯為自己所用。

與理則是一個極好的替代解決方案。它將正常代碼 和錯誤處理代碼清晰的劃分開來,程序變得非常干凈并且容易維護。本文討論了編譯器如何實現異常處理。我將假定你已經熟悉C++編譯器處理的語法和機制。本文還提供 了一個用于VC++的異常處理庫,要用庫中的處理程序替換掉VC++提供的那個,你只需要調用下面這個函數:

struct EXCEPTION_REGISTRATION  {      EXCEPTION_REGISTRATION* prev;      DWORD handler;  };

之后,程序中的所有異常,從它們被拋出到堆棧展開(stack unwinding),再到調用catch塊,***到程序恢復正常運行,都將由我的異常處理庫來管理。
與其它C++特性一樣,C++標準并沒有規定編譯器應該如何來實現異常處理。這意味著每一個編譯器的提供商都可以用它們認為恰當的方式來實現它。下面我會 描述一下VC++是怎么做的,但即使你使用其它的編譯器或操作系統①,本文也應該會是一篇很好的學習材料。VC++的實現方式是以windows系統的結 構化異常處理(SEH)②為基礎的。

struct EXCEPTION_REGISTRATION  {      EXCEPTION_REGISTRATION* prev;      DWORD handler;  };

在本文的討論中,我認為異常或者是被明確的拋出的,或者是由于除零溢出、空指針訪問等引起的。當它發生時會產生一個中斷,接下來控制權就會傳遞到操作系統 的手中。操作系統將調用異常處理程序,C++編譯器異常發生位置開始的函數調用序列,進行堆棧展開和控制權轉移。Windows定義了結構 "EXCEPTION_REGISTRATION",使我們能夠向操作系統注冊自己的異常處理程序。

#include   #include    using std::cout;   using std::endl;    struct EXCEPTION_REGISTRATION   {       EXCEPTION_REGISTRATION* prev;       DWORD handler;   };    EXCEPTION_DISPOSITION myHandler(       _EXCEPTION_RECORD *ExcRecord,       void * EstablisherFrame,       _CONTEXT *ContextRecord,       void * DispatcherContext)   {       cout << "In the exception handler" << endl;       cout << "Just a demo. exiting..." << endl;       exit(0);       return ExceptionContinueExecution; //不會運行到這   }    int  g_div = 0;    void bar()   {       //初始化一個EXCEPTION_REGISTRATION結構       EXCEPTION_REGISTRATION reg, *preg = &reg;        reg.handler = (DWORD)myHandler;        //取得當前異常處理鏈的"頭"       DWORD prev;       _asm       {           mov EAX, FS:[0]           mov prev, EAX       }       reg.prev = (EXCEPTION_REGISTRATION*) prev;        //注冊!       _asm       {           mov EAX, preg           mov FS:[0], EAX       }        //產生一個異常       int  j = 10 / g_div;  //異常,除零溢出   }    int  main()   {       bar();       return 0;   }    /*-------輸出-------------------   In the exception handler   Just a demo. exiting...

C++編譯器用于建立一個EXCEPTION_REGISTRATION結構的鏈表,每次注冊新的EXCEPTION_REGISTRATION時,我們都要把原來注冊的那個的地址存到prev中。 那么,那個異常回調函數長什么樣呢?在excpt.h中,windows定義了它的原形: 注意EXCEPTION_REGISTRATION必須定義在棧上,并且必須位于比上一個結點更低的內存地址上,windows對此有嚴格要求,達不到的話,它就會立刻終止進程。

上述內容就是C++編譯器是怎樣實現異常處理,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

鄱阳县| 甘肃省| 平湖市| 芦山县| 屏东市| 色达县| 兰考县| 湖北省| 疏附县| 漳州市| 镇沅| 明光市| 霍州市| 溆浦县| 定兴县| 高唐县| 德江县| 广河县| 馆陶县| 饶河县| 大田县| 灌云县| 临江市| 新余市| 江西省| 盐城市| 常州市| 乾安县| 定兴县| 当雄县| 凤山县| 长乐市| 阜新| 广安市| 九江市| 尚义县| 琼结县| 绥化市| 册亨县| 商都县| 赫章县|