在构建 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();
};
  1. 我需要将处理器 class 标记为 DLL_SPEC 吗?
  2. 我需要将 ProcessorBase 标记为 DLL_SPEC 吗?
  3. 我需要为客户端代码提供 ProcessorBase header 文件吗?如果是,我需要提供多少个parents继承层次?

由于处理器代码是内联的,因此没有必要将 Processor class 标记为 DLL_SPEC - 所有代码都将在客户端模块中实例化。 将被导入的唯一方法是 ~ProcessorBase() - 所以只标记这个方法。 顺便说一句,如果您的 DLL 和客户端模块使用不同版本的 C 运行时库,则导出析构函数可能不安全。在这种情况下,添加导出方法 void destroy() 并在实现中调用 delete this