是否有一个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似乎会自动为我优化这些。 实际上,这一行出现在http://gcc.gnu.org/gcc-4.5/changes.html的更改列表中:

  • GCC现在优化exception处理代码。 特别是被certificate没有任何影响的清理区域被优化出来。