c/c++语言开发共享是否有一个gcc选项假设所有extern“C”函数都不能传播exception?

有没有办法,除了在每个函数原型上放置一个属性,让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

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐