所以我们有一个公共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时会发生什么?我知道这种行为可能是“未定义的”,但我对各种平台上发生的事情感兴趣。
答案 0 :(得分:1)
在Win32 C ++中,异常是在SEH(结构化异常处理)之上实现的。异常通过C代码传播并崩溃,除非C代码通过SEH机制捕获它们。