我正在开发一个C++组件dll,可以被C或C++应用程序使用。暴露的dll函数如下:
#include <tchar.h>
#ifdef IMPORT
#define DLL __declspec(dllimport)
#else
#define DLL __declspec(dllexport)
#endif
extern "C" {
DLL bool __cdecl Init();
DLL bool __cdecl Foo(const TCHAR*);
DLL bool __cdecl Release();
}
这些函数的内部实现是C ++类,但不会公开。假设使用这种风格,dll可以用于C或C++应用程序。 问题在于我没有处理任何类型的C++异常(例如bad_alloc),而是将此任务留给了调用方(更高层次的代码)。 经过与同事的激烈讨论,他们认为我应该捕获所有异常并返回错误代码,或者至少返回false,因为对于C应用程序来说无法处理C++异常?这是真的吗?一般情况下我应该怎么做?如果你正在开发将由其他系统使用的组件,有什么通用的异常处理规则吗?
std::set_unexpected()
函数将C风格的/具有extern C
链接的函数注册为未捕获异常的异常处理程序。如果已知该函数的名称修饰符,您可以直接从纯C代码中调用它。否则,您可以公开一个extern C
包装器函数。需要注意的是这并不是一个方便的界面,但如果绝对避免不了库污染其它范围之外的内容,这种方法也是可行的。 - FrankH.std::set_terminate()
而不是std::set_unexpected()
来使 C++ 运行时重定向到由 C 提供的函数。以下是示例。 - FrankH.