c++ - 当 C++ 实现向 C 代码抛出异常时会发生什么

标签 c++ c exception

所以我们有一个公共(public)的 C 头文件(所有东西都可以被 C 调用)

 //foo.h
 #ifndef FOO_H
 #define FOO_H
 extern "C"
 {
   struct Foo;
   typdef FooHandle Foo*;

   FooHandle Foo_init();

   int Foo_bar(FooHandle handle);
 }
 #endif

然后是C++头文件:

 //foo.hpp
 #ifndef FOO_HPP
 #define FOO_HPP

 namespace my_foo
 {
   class Foo
   {
   public:
     int bar();
   };
 }

比源文件:

 //foo.cpp
 #include "foo.h"
 #include "foo.hpp"
 #include <exception>

 void my_foo::Foo:bar() {throw std::exception();}

 FooHandle Foo_init() { return reinterpret_cast<FooHandle>(new my_foo::Foo());}
 int Foo_bar(FooHandle handle){
    my_foo::Foo& foo = *reinterpret_cast<my_foo::Foo*>(handle);
    foo.bar();
 }

当我在各种平台上从纯 C 上下文(因为不允许 C++ 异常)调用 Foo_bar 时会发生什么?我知道这种行为可能是“未定义的”,但我对各种平台上发生的事情很感兴趣。

最佳答案

在 Win32 中,C++ 异常是在 SEH(结构化异常处理)之上实现的。异常通过 C 代码传播并使其崩溃,除非 C 代码通过 SEH 机制捕获它们。

关于c++ - 当 C++ 实现向 C 代码抛出异常时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23270947/

相关文章:

c++ - 运行时函数在编译时函数上分支?

c++ - 递增指针打印垃圾?

C - malloc 和结构、段错误

c - Eclipse CDT宏自动格式化

Symfony 4 - 控制台异常事件监听器

java - 无法将 jTextfield 字符串转换为浮点值......给出数字格式异常

c++ - 在 C++ 中使用 for 循环初始化一系列数组

c++ - "thread-safe"函数并行化框架是否依赖?

c - 使用 boolean 值 "mask"数组进行数组索引

java - 抛出异常 - 并且代码进一步执行