如何将C++函数导出为抛出异常的dll?

问题描述 投票:0回答:3

当我尝试将以下函数导出为 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++ dll compiler-warnings dllexport
3个回答
5
投票

据我所知,如果您需要一个可以抛出异常的“C”函数,则必须使用

/EHs
。请参阅:/EH(异常处理模型)。您需要在 VisualStudio 项目中进行设置。

相反,

/EHc
告诉编译器假设 extern C 函数永远不会抛出 C++ 异常。你的编译器会抱怨你的
void some_func()
确实会抛出异常。


3
投票

如果您决心执行编译器警告您的操作,为什么不直接抑制警告呢?

#pragma warning(disable: 4247)

0
投票

我相信更好的方法是导出课程:

// 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;
}

© www.soinside.com 2019 - 2024. All rights reserved.