有没有办法,除了在每个函数原型上放置一个属性,让gcc知道C函数永远不会传播exception,即在extern "C"
声明的所有函数都应该是__attribute__((nothrow))
? 理想的是-f
风格的命令行选项。
您始终可以使用-fno-exceptions
,这将确保c ++编译器不会生成exception传播代码。
边注:
你确定告诉编译器“所有这些funcs永远不会抛出”正是你想要的吗?
extern "C" ...
函数不一定能传播/触发exception。 举一个例子:
class Foo { public: class Away {}; static void throwaway(void) { throw Away(); } } extern "C" { void wrap_a_call(void (*wrapped)(void)) { wrapped(); } } int main(int argc, char **argv) { wrap_a_call(Foo::throwaway); return 0; }
编译并运行它会创建一个C-linkage函数wrap_a_call()
,当像上面那样调用它时,会wrap_a_call()
导致exception:
$ ./test terminate called after throwing an instance of 'Foo::Away' Abort(coredump)
即extern "C"
(通过调用函数指针)可能存在“exception泄漏”,并且因为您在C ++中的特定位置使用/调用extern "C"
函数并不能保证在调用时不会抛出任何exception那些。
当引发exception时,它会生成中断,展开堆栈并覆盖现有堆栈。 它达到了try / except语法的地步。 如果您不使用exception,这意味着您没有任何开销。 只有内存/时间的开销是在try / catch块中,而堆栈在throw()中展开。
如果您的c函数不会产生exception,那么当您在C ++中调用try / catch时,您的开销只会在空间中,但对于任何数量的exception都是相同的。 (初始化这个小空间丝毫不变的时间开销很小)。
GCC 4.5似乎会自动为我优化这些。 实际上,这一行出现在https://gcc.gnu.org/gcc-4.5/changes.html的更改列表中:
需要了解更多c/c++开发分享是否有一个gcc选项假设所有extern“C”函数都不能传播exception?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享是否有一个gcc选项假设所有extern“C”函数都不能传播exception?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980408.html