日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
深度剖析C++編譯器怎樣實現(xiàn)異常處理

由于C++編譯器裝程序太多,此處無法上傳,所以大家有communitysever的可以從里面獲得然后反編譯為自己所用,沒有的就到網(wǎng)絡(luò)上搜下吧,有許多資源呢!下面進行詳細說明。

站在用戶的角度思考問題,與客戶深入溝通,找到嵊泗網(wǎng)站設(shè)計與嵊泗網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬主機、企業(yè)郵箱。業(yè)務(wù)覆蓋嵊泗地區(qū)。

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

 
 
 
  1. struct EXCEPTION_REGISTRATION  
  2. {  
  3.     EXCEPTION_REGISTRATION* prev;  
  4.     DWORD handler;  
  5. };  

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

 
 
 
  1. struct EXCEPTION_REGISTRATION  
  2. {  
  3.     EXCEPTION_REGISTRATION* prev;  
  4.     DWORD handler;  
  5. };  

在本文的討論中,我認為異?;蛘呤潜幻鞔_的拋出的,或者是由于除零溢出、空指針訪問等引起的。當它發(fā)生時會產(chǎn)生一個中斷,接下來控制權(quán)就會傳遞到操作系統(tǒng) 的手中。操作系統(tǒng)將調(diào)用異常處理程序,C++編譯器異常發(fā)生位置開始的函數(shù)調(diào)用序列,進行堆棧展開和控制權(quán)轉(zhuǎn)移。Windows定義了結(jié)構(gòu) "EXCEPTION_REGISTRATION",使我們能夠向操作系統(tǒng)注冊自己的異常處理程序。

 
 
 
  1. #include   
  2. #include   
  3.  
  4. using std::cout;   
  5. using std::endl;   
  6.  
  7. struct EXCEPTION_REGISTRATION   
  8. {   
  9.     EXCEPTION_REGISTRATION* prev;   
  10.     DWORD handler;   
  11. };   
  12.  
  13. EXCEPTION_DISPOSITION myHandler(   
  14.     _EXCEPTION_RECORD *ExcRecord,   
  15.     void * EstablisherFrame,   
  16.     _CONTEXT *ContextRecord,   
  17.     void * DispatcherContext)   
  18. {   
  19.     cout << "In the exception handler" << endl;   
  20.     cout << "Just a demo. exiting..." << endl;   
  21.     exit(0);   
  22.     return ExceptionContinueExecution; //不會運行到這   
  23. }   
  24.  
  25. int  g_div = 0;   
  26.  
  27. void bar()   
  28. {   
  29.     //初始化一個EXCEPTION_REGISTRATION結(jié)構(gòu)   
  30.     EXCEPTION_REGISTRATION reg, *preg = ?    
  31.     reg.handler = (DWORD)myHandler;   
  32.  
  33.     //取得當前異常處理鏈的"頭"   
  34.     DWORD prev;   
  35.     _asm   
  36.     {   
  37.         mov EAX, FS:[0]   
  38.         mov prev, EAX   
  39.     }   
  40.     reg.prev = (EXCEPTION_REGISTRATION*) prev;   
  41.  
  42.     //注冊!   
  43.     _asm   
  44.     {   
  45.         mov EAX, preg   
  46.         mov FS:[0], EAX   
  47.     }   
  48.  
  49.     //產(chǎn)生一個異常   
  50.     int  j = 10 / g_div;  //異常,除零溢出   
  51. }   
  52.  
  53. int  main()   
  54. {   
  55.     bar();   
  56.     return 0;   
  57. }   
  58.  
  59. /*-------輸出-------------------   
  60. In the exception handler   
  61. Just a demo. exiting...  

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

【編輯推薦】

  1. 有關(guān)C++優(yōu)化代碼問題詳細說明
  2. 對C++庫函數(shù)進行學習探索總結(jié)筆記
  3. 幾分鐘教會您使用Visual C++ 6.0設(shè)計程序
  4. 大致介紹C++語言相關(guān)使用及其錯誤修改
  5. 有關(guān)C++優(yōu)化代碼問題詳細說明

新聞名稱:深度剖析C++編譯器怎樣實現(xiàn)異常處理
新聞來源:http://www.5511xx.com/article/ccohhed.html