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

时间:2018-04-27 20:09:13

标签: c++ c function exception 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 ~~~~

问题:

f2 中的异常是否通过f1进入并在f0中正确捕获?

或者是由于未处理异常而调用 std :: unexpected ,还是整个事情应该是未定义的行为? - 如果是这样,标准中的内容就是在这个特定的上下文中讨论异常处理。

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

1 个答案:

答案 0 :(得分: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 ++异常),异常处理将使用通用机制