31

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

它看起来像这样:

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

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

4 回答 4

15

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

的,从某种意义上说,无论是语言还是编译器都不会阻止您这样做。

,从某种意义上说,如果你抛出,这将是一个未定义的行为,因为 C++ 异常跨越了语言边界。

在实践中:不要这样做。捕获异常并将其转换为错误代码,或其他语言可以理解的方式。

所以底线是:不要从标记为的函数中抛出异常extern "C"

于 2013-04-06T00:39:26.753 回答
8

对于GCC,答案似乎没有定论

但是,MSVC 文档在该主题上相对清晰:

  • /EHaand /EHs...告诉编译器假设声明为 extern "C" 的函数可能会引发异常。
  • /EHsc...告诉编译器假设声明为 extern "C" 的函数永远不会引发 C++ 异常

因此,对于 Visual-C++,是否获得定义的行为取决于编译器选项。

于 2014-06-16T11:01:21.240 回答
2

它会编译,但从标记为具有 C 链接的函数抛出是未定义的行为。C 没有异常,因此通常您应该只返回一个错误代码和/或提供一个返回有关最后一个错误的信息的函数。

#include <exception>
extern "C" void foo() {throw std::exception();}

编译好

于 2013-04-06T00:42:36.013 回答
1

这是您问题的答案:http: //yosefk.com/c++fqa/mixing.html#fqa-32.6

基本上你是抓不到的。(但为什么你不只是编译它并尝试?:))

于 2013-04-06T00:38:42.637 回答