我有使用extern "C"
声明的C ++函数,即使它们只在C ++代码中调用。是的,我知道这很奇怪但是我想要保持一致性,因为我们混合了C和C ++声明。我只是想确保将C ++函数声明为extern "C"
不会影响抛出的行为。
它看起来像这样:
extern "C" void foo() {throw exception;}
int bar()
{
try
{
foo();
} catch (exception e) { return 1; }
}
答案 0 :(得分:9)
“可以将C ++函数标记为Extern”C“throw?”
是,因为语言和编译器都不会阻止您这样做。
否,从某种意义上说,如果你抛出,它将是一个未定义的行为,因为C ++异常跨越了语言边界。
在实践中:不要这样做。抓住异常并将其转换为错误代码,或者其他语言可以理解的意思。
所以底线是:不要从标记为extern "C"
的函数中抛出异常。
答案 1 :(得分:5)
GCC the answer seems inconclusive。
然而MSVC documentation在这个问题上相对清楚:
/EHa
和/EHs
... 告诉编译器假设声明为extern“C”的函数可能会抛出异常。 /EHsc
... 告诉编译器假设声明为extern“C”的函数从不抛出C ++异常 因此,对于Visual-C ++,它取决于编译器选项是否获得定义的行为。
答案 2 :(得分:2)
它将编译但是从标记为具有C链接的函数抛出是未定义的行为。 C没有例外,因此通常你应该只返回一个错误代码和/或提供一个返回上一个错误信息的函数。
#include <exception>
extern "C" void foo() {throw std::exception();}
编译好
答案 3 :(得分:0)
以下是您的问题的答案:http://yosefk.com/c++fqa/mixing.html#fqa-32.6
基本上你无法捕捉到它。 (但为什么你不会只编译它并尝试?:))