在构建 dll 时,我需要在 headers 中为客户端提供多少 parents 作为 __declspec(导出)?
How many parents I need provide as __declspec(export) in headers for client when building dll?
我正在为自己编写一个小引擎。而且我不知道如何为客户端代码提供最少数量的 headers 和来自引擎的信息。用户需要的只是 Processor 模板 class 和两个 public 方法,以及用户必须覆盖的 IProcessor 中的方法。问题如下。
#ifdef __ARENGINE_ON_WORK__
#define DLL_SPEC __declspec(dllexport)
#else
#define DLL_SPEC
#endif
template<typename T, typename... masks>
class Processor : public ProcessorBase
{
public:
DLL_SPEC static BitMask Mask()
{
static const BitMask mask = FormMask((masks::Mask())...);
return mask;
}
DLL_SPEC BitMask GetMask() override
{
return Mask();
}
private:
template<typename... masks>
static BitMask FormMask(const masks&... args)
{
BitMask resultMask = 0;
std::vector<BitMask> vec = { args... };
for (auto item : vec) resultMask |= item;
return resultMask;
}
};
class DLL_SPEC ProcessorBase : public EngineStorable, public IProcessor
{
public:
~ProcessorBase();
private:
void NotifyProcessorDeleting();
};
- 我需要将处理器 class 标记为 DLL_SPEC 吗?
- 我需要将 ProcessorBase 标记为 DLL_SPEC 吗?
- 我需要为客户端代码提供 ProcessorBase header 文件吗?如果是,我需要提供多少个parents继承层次?
由于处理器代码是内联的,因此没有必要将 Processor
class 标记为 DLL_SPEC - 所有代码都将在客户端模块中实例化。
将被导入的唯一方法是 ~ProcessorBase()
- 所以只标记这个方法。
顺便说一句,如果您的 DLL 和客户端模块使用不同版本的 C 运行时库,则导出析构函数可能不安全。在这种情况下,添加导出方法 void destroy()
并在实现中调用 delete this
。
我正在为自己编写一个小引擎。而且我不知道如何为客户端代码提供最少数量的 headers 和来自引擎的信息。用户需要的只是 Processor 模板 class 和两个 public 方法,以及用户必须覆盖的 IProcessor 中的方法。问题如下。
#ifdef __ARENGINE_ON_WORK__
#define DLL_SPEC __declspec(dllexport)
#else
#define DLL_SPEC
#endif
template<typename T, typename... masks>
class Processor : public ProcessorBase
{
public:
DLL_SPEC static BitMask Mask()
{
static const BitMask mask = FormMask((masks::Mask())...);
return mask;
}
DLL_SPEC BitMask GetMask() override
{
return Mask();
}
private:
template<typename... masks>
static BitMask FormMask(const masks&... args)
{
BitMask resultMask = 0;
std::vector<BitMask> vec = { args... };
for (auto item : vec) resultMask |= item;
return resultMask;
}
};
class DLL_SPEC ProcessorBase : public EngineStorable, public IProcessor
{
public:
~ProcessorBase();
private:
void NotifyProcessorDeleting();
};
- 我需要将处理器 class 标记为 DLL_SPEC 吗?
- 我需要将 ProcessorBase 标记为 DLL_SPEC 吗?
- 我需要为客户端代码提供 ProcessorBase header 文件吗?如果是,我需要提供多少个parents继承层次?
由于处理器代码是内联的,因此没有必要将 Processor
class 标记为 DLL_SPEC - 所有代码都将在客户端模块中实例化。
将被导入的唯一方法是 ~ProcessorBase()
- 所以只标记这个方法。
顺便说一句,如果您的 DLL 和客户端模块使用不同版本的 C 运行时库,则导出析构函数可能不安全。在这种情况下,添加导出方法 void destroy()
并在实现中调用 delete this
。