当我尝试将以下函数导出为 dll 时:
extern "C" __declspec(dllexport) void some_func()
{
throw std::runtime_error("test throwing exception");
}
Visual C++ 2008 给我以下警告:
1>.\SampleTrainer.cpp(11) : warning C4297: 'some_func' : function assumed not to throw an exception but does
1> The function is extern "C" and /EHc was specified
我需要 extern "C" 因为我使用 Qt QLibrary 来加载 dll 并解析函数名称。如果没有 extern "C" 它就找不到 some_func() 函数。
据我所知,如果您需要一个可以抛出异常的“C”函数,则必须使用
/EHs
。请参阅:/EH(异常处理模型)。您需要在 VisualStudio 项目中进行设置。
相反,
/EHc
告诉编译器假设 extern C 函数永远不会抛出 C++ 异常。你的编译器会抱怨你的 void some_func()
确实会抛出异常。
如果您决心执行编译器警告您的操作,为什么不直接抑制警告呢?
#pragma warning(disable: 4247)
我相信更好的方法是导出课程:
// Interface
class Export
{
public:
// May throw
virtual void someFunc() = 0;
public:
Export(Export&&) = delete;
Export& operator=(Export&&) = delete;
protected:
Export() = default;
~Export() = default;
};
// Never throws
DLL_API(Export&) getExport();
// Implementation
struct ExportImpl: Export
{
void someFunc() override { /* do something */ }
};
static ExportImpl exportInstance;
DLL_API(Export&) getExport()
{
return exportInstance;
}