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