2012-08-13 87 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