可以标记为Extern“C”的C ++函数抛出吗?

时间:2013-04-06 00:31:10

标签: c++ extern-c

我有使用extern "C"声明的C ++函数,即使它们只在C ++代码中调用。是的,我知道这很奇怪但是我想要保持一致性,因为我们混合了C和C ++声明。我只是想确保将C ++函数声明为extern "C"不会影响抛出的行为。

它看起来像这样:

extern "C" void foo() {throw exception;}

int bar()
{
    try
    {
        foo();
    } catch (exception e) { return 1; }
}

4 个答案:

答案 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

基本上你无法捕捉到它。 (但为什么你不会只编译它并尝试?:))