我有C++函数我想要声明使用,extern "C"即使它们只在C++代码中调用.是的,我知道这很奇怪但是我想要保持一致性,因为我们混合了C和C++声明.我只是想确保声明一个C++函数extern "C"不会影响抛出的行为.
它看起来像这样:
extern "C" void foo() {throw exception;}
int bar()
{
    try
    {
        foo();
    } catch (exception e) { return 1; }
}
Nat*_*nst 10
"可以将C++函数标记为Extern"C"抛出吗?"
是的,从某种意义上说语言和编译器都不会阻止你这样做.
不,从某种意义上说,如果你抛出,它将是一个未定义的行为,因为C++异常跨越了语言边界.
在实践中:不要这样做.捕获异常并将其转换为错误代码,或者其他语言可以理解的方式.
所以底线是:不要从标记为的函数中抛出异常extern "C".
然而,MSVC文档在这个主题上相对清楚:
/EHa和/EHs... 告诉编译器假设声明为extern"C"的函数可能会抛出异常./EHsc... 告诉编译器假设声明为extern"C"的函数从不抛出C++异常 因此,对于Visual-C++,它是否依赖于编译器选项是否获得定义的行为.