通过C函数调用抛出C++异常

J M*_*ion 12 c c++ exception function undefined-behavior

我有三个免费功能:F0,F1和F2.F0调用F1,然后调用F2.

F0和F2是C++函数,其中F1是C函数.F2通过以下方式暴露于F1:extern"C"

每个免费功能的代码如下:

~~~~ F0.cpp ~~~~

void f0()
{
   try
   {
      f1();
   }
   catch (...)
   {}
}

~~~~ F0.cpp ~~~~


~~~~ F1.c ~~~~

void f1()
{
   f2();
}

~~~~ F1.c ~~~~


~~~~ F2.cpp ~~~~

void f2()
{
  throw 1
}

~~~~ F2.cpp ~~~~
Run Code Online (Sandbox Code Playgroud)

题:

是否例外F2抛出的进展,通过F1和F0正确抓到?

或者由于未处理异常而调用std :: unexpected,或者整个事情应该是未定义的行为? - 如果是这样,它在标准中的哪个部分讨论了在这个特定环境中的异常处理.


请注意,这不是关于在C中处理异常,而是在异常可以流经C层(如果有的话)并被调用C++层捕获的情况下发生的情况 - 以及任何产生的副作用等.

Sev*_*eux 9

这是特定于平台和编译器的问题.

例如,在Linux/GCC上,你必须使用-fexceptions选项编译C代码,然后将构建展开表,异常将抛出C代码.

来自https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Code-Gen-Options.html#index-fexceptions

-fexceptions

启用异常处理.生成传播异常所需的额外代码.对于某些目标,这意味着GCC会为所有函数生成帧展开信息,这会产生大量的数据大小开销,尽管它不会影响执行.如果不指定此选项,GCC默认为通常需要异常处理的C++等语言启用它,并为C语言通常不需要它的语言禁用它.但是,在编译需要与使用C++编写的异常处理程序正确互操作的C代码时,可能需要启用此选项.如果要编译不使用异常处理的旧C++程序,您可能还希望禁用此选项.

我对Visual C++/Windows开发不太熟悉,但我相信如果使用/ EHa选项编译C++和C代码(允许混合结构化和C++异常),异常处理将使用通用机制