所以我们有一个公共(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/