中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

發布時間:2021-08-23 18:26:30 來源:億速云 閱讀:167 作者:chen 欄目:編程語言

這篇文章主要介紹“C++編譯器怎么實現異常處理”,在日常操作中,相信很多人在C++編譯器怎么實現異常處理問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++編譯器怎么實現異常處理”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

C++編譯器是一個與標準化C++高度兼容的編譯環境,其強大的CUP優化功能可以使程序變得非常干凈并且容易維護,好了下面就請大家跟隨本文一起進入C++編譯器的世界吧。

本文討論了C++編譯器如何實現異常處理。我將假定你已經熟悉異常處理的語法和機制。本文還提供了一個用于VC++的異常處理庫,要用庫中的處理程序替換掉VC++提供的那個,你只需要調用下面這個函數:

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


之后,程序中的所有異常,從它們被拋出到堆棧展開(stack unwinding),再到調用catch塊,***到程序恢復正常運行,都將由我的異常處理庫來管理與其它C++特性一樣,C++標準并沒有規定編譯器應該如何來實現異常處理。

這意味著每一個C++編譯器的提供商都可以用它們認為恰當的方式來實現它。下面我會描述一下VC++是怎么做的,但即使你使用其它的C++編譯器或操作系統①,本文也應該會是一篇很好的學習材料。

VC++的實現方式是以windows系統的結構化異常處理(SEH)②為基礎的。 結構化異常處理—概述在本文的討論中,我認為異常或者是被明確的拋出的,或者是由于除零溢出、空指針訪問等引起的。

當它發生時會產生一個中斷,接下來控制權就會傳遞到操作系統的手中。操作系統將調用異常處理程序,檢查從異常發生位置開始的函數調用序列,進行堆棧展開和控制權轉移。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       }

注意EXCEPTION_REGISTRATION必須定義在棧上,并且必須位于比上一個結點更低的內存地址上,Windows對此有嚴格要求,達不到的話,它就會立刻終止進程。

到此,關于“C++編譯器怎么實現異常處理”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

c++
AI

牙克石市| 台中市| 奈曼旗| 玉山县| 乳山市| 车致| 汝城县| 南召县| 额济纳旗| 弥勒县| 林西县| 饶平县| 塘沽区| 吴川市| 澜沧| 黑龙江省| 内江市| 安顺市| 特克斯县| 永吉县| 英德市| 乐山市| 绿春县| 长阳| 陆良县| 绥江县| 荣昌县| 巢湖市| 项城市| 榆树市| 金塔县| 咸宁市| 湘阴县| 交口县| 英德市| 北川| 临清市| 青铜峡市| 余庆县| 靖远县| 桦南县|