2012-08-13 89 views
-1

如果我知道我的程序中的某個特定的extern "C"函數(比如RaiseException)是引發SEH異常的唯一函數,並且我希望它們轉換爲C++異常,那麼是否有任何方法可以爲此選擇性地啓用/EHa函數,以便將例外轉換爲CStructured_Exception而不會膨脹,或者將其餘的程序放慢爲normally caused by /EHa如何通過/ EHsc獲得/ EHa對特定功能的好處?

+0

不,它需要在呼叫站點處於活動狀態。提供證據證明這兩個cpu指令*真的會減慢你的代碼速度。早就消除了。現在的「omigod,這是糟糕的泥」是一個沒有優點的釣魚探險隊。 – 2012-08-14 00:05:29

+0

@HansPassant:Microsoft *自己說(甚至在VS 2012文檔中)*「'/ EHa」可能會導致性能降低,因爲編譯器不會像積極地優化'try'塊,即使編譯器沒有看到「拋出」*,我不認爲他們在說這個時犯了錯誤(請隨時糾正我)。至於代碼膨脹(這是*沒有提到),這是真實的:我的可執行文件用'/ EHa'獲得大約10-20%的大。我從來沒有說過它「吮吸」(哎呀,至少'/ EHa'可用),我只是覺得沒有必要爲我不使用的東西膨脹我的可執行文件。 – Mehrdad 2012-08-14 00:14:11

回答

1

顯然沒有編譯器選項來做到這一點。也許:

void RaiseException() { 
    __try { 
     // do something that might throw here... 
    } 

    __except(EXCEPTION_EXECUTE_HANDLER) { 
     throw std::exception("structured exception"); 
    } 
} 
+0

我*可以*做一個包裝函數,但是它感覺有點奇怪,拋出,捕獲然後再拋出,這樣我就可以得到一個'EXCEPTION_POINTERS'結構來提供給'CStructured_Exception'。不過,這是一個有效的選擇,我猜... +1 – Mehrdad 2012-08-14 00:17:39