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

时间:2014-04-24 13:51:39

标签: c++ c exception

所以我们有一个公共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时会发生什么?我知道这种行为可能是“未定义的”,但我对各种平台上发生的事情感兴趣。

1 个答案:

答案 0 :(得分:1)

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