VC編譯選項 /EHa 異常處理


 1 #include <stdio.h>
 2 void main()
 3 { 
 4 char *a; 
 5 try 
 6 { 
 7 a=0; 
 8 (*a)=0; 
 9 }
10  catch(...)
11  {
12  printf("oops,exception!!\n");
13  }
14 } 


這段代碼的運行結果是什么?
你一定會說
"屏幕上打出oops,exception!!\n".
沒錯,理論上的確是這樣.
我們來驗證一下,用vc6產生一個空的win32 console工程,
加入上面的cpp文件,
debug方式編譯后,得到如期的結果,
但是!
release方式編譯后,仍然出現了"訪問沖突"!

這如何解釋?
本怪獸經調查發現,
VC里缺身編譯選項里關於異常的選項是/GX,
文檔里說,這等價與/EHs--同步異常捕捉.
何解?
答:只有編譯器認為有可能出異常的情況下,
即有throw出現的情況下,
編譯器才會生成異常捕捉代碼.

據說是VC6的一項新優化功能,
真是自作聰明!誰會希望這樣的"異常捕捉"?

解決方法,去掉/GX,加上/EHa--異步異常捕捉.
這樣可以保證異常捕捉代碼不被"高明"的編譯器優化掉.

那為何開頭的例子里,debug版本運行正常呢?
答:debug版本不做優化.故正常也.

這是VC6 IDE里非常莫名其妙的地方,
用try catch的人請一定小心.  
------------------------------------------------------------------------------------------------------------

在【屬性】-》【C/C++】-》【代碼生成】-》【啟用C++異常】有如下4個選項,點擊組合框,顯示:


是(/EHsc)
是,但有 SEH 異常(/EHa)
<從父級或項目默認設置繼承>

1、如果不選擇【是,但有 SEH 異常(/EHa)】選項,try { } catch(...) {} 不起作用。新建項目缺省值是【是(/EHsc)】。就是說在缺省情況下微軟不支持標准C++。

2、微軟自己又弄出:__try { } __except(EXCEPTION_EXECUTE_HANDLER) { }。【啟用C++異常】選項對此不起作用,選什么都起作用。建議不要使用。還是使用標准的吧。

3、微軟還弄出:TRY{} CATCH_ALL(e) {} END_CATCH_ALL不知為什么還弄。可能微軟的開發人員那天還得弄。

總結:掌握第1種方法就足夠了,其實也不應該出現其他方法。如果你的是在從API封裝類,建議還是用第2種方法,可能你的類要應用到很多項目,那個項目是否選擇了【是,但有 SEH 異常(/EHa)】就很難說了,可能那個程序員根本就沒有注意到【是,但有 SEH 異常(/EHa)】選項,使用第1種方法會使你的異常失效。但我又覺得__try { }實在不是個東西,看着別扭。

-------------------------------------------------------------------------------------------------------------

VC編譯優化設置0
VC- Project Setting-Debug-Project Option語法解釋

-優化-

/O1 最小化空間 minimize space

/Op[-] 改善浮點數一致性 improve floating-pt consistency

/O2 最大化速度 maximize speed

/Os 優選代碼空間 favor code space

/Oa 假設沒有別名 assume no aliasing

/Ot 優選代碼速度 favor code speed

/Ob 內聯展開(默認 n=0) inline expansion (default n=0)

/Ow 假設交叉函數別名 assume cross-function aliasing

/Od 禁用優化(默認值) disable optimizations (default)

/Ox 最大化選項。(/Ogityb2 /Gs) maximum opts. (/Ogityb1 /Gs)

/Og 啟用全局優化 enable global optimization

/Oy[-] 啟用框架指針省略 enable frame pointer omission

/Oi 啟用內建函數 enable intrinsic functions

-代碼生成-

/G3 為 80386 進行優化 optimize for 80386

/G4 為 80486 進行優化 optimize for 80486

/GR[-] 啟用 C++ RTTI enable C++ RTTI

/G5 為 Pentium 進行優化 optimize for Pentium

/G6 為 Pentium Pro 進行優化 optimize for Pentium Pro

/GX[-] 啟用 C++ 異常處理(與 /EHsc 相同) enable C++ EH (same as /EHsc)

/EHs 啟用同步 C++ 異常處理 enable synchronous C++ EH

/GD 為 Windows DLL 進行優化 optimize for Windows DLL

/GB 為混合模型進行優化(默認) optimize for blended model (default)

/EHa 啟用異步 C++ 異常處理 enable asynchronous C++ EH

/Gd __cdecl 調用約定 __cdecl calling convention

/EHc extern“C”默認為 nothrow extern "C" defaults to nothrow

/Gr __fastcall 調用約定 __fastcall calling convention

/Gi[-] 啟用增量編譯 enable incremental compilation

/Gz __stdcall 調用約定 __stdcall calling convention

/Gm[-] 啟用最小重新生成 enable minimal rebuild

/GA 為 Windows 應用程序進行優化 optimize for Windows Application

/Gf 啟用字符串池 enable string pooling

/QIfdiv[-] 啟用 Pentium FDIV 修復 enable Pentium FDIV fix

/GF 啟用只讀字符串池 enable read-only string pooling


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM