c++ - 如何在 DLL 边界上公开 STL 列表?

标签 c++ stl abi

我有一个 DLL,它需要访问存储在主机应用程序的 STL 容器中的数据。因为 C++ 没有标准的 ABI,而且我想支持不同的编译器,所以应用程序和 DLL 之间的接口(interface)基本上必须保持纯旧数据。

对于 vector ,这是相对简单的。您可以简单地返回 vector 的内存块,因为它保证是连续的:

// To return vector<int> data
virtual void GetVectorData(const int*& ptr, size_t& count) const
{
    if (!vec.empty())
        ptr = &(vec.front());

    count = vec.size();
}

现在 DLL 可以通过该接口(interface)对 vector 数据进行安全的只读访问。 DLL 也可以包装它以将内容复制到它自己的 vector 中。

但是 STL 列表(和双端队列)呢?是否有另一种直接的方法允许通过 DLL 边界进行访问?还是我必须求助于某种 GetFirst()/GetNext() 接口(interface)?我可能需要为很多列表执行此操作,所以最好有一个像 vector 一样简单的解决方案。

最佳答案

您可以在 DLL 之间传递 STL 对象并支持不同的编译器,如果您在实例化每个 STL 类型的地方小心的话。您需要一些智能的“DLLEXPORT”宏——我使用以下设置成功支持 VC 和 gcc。

#ifdef WIN32
#ifdef MYDLLLIB_EXPORTS      // DLL export macros
#define MYDLLLIB_API __declspec(dllexport)
#define MYDLLLIB_TEMPLATE
#else
#define MYDLLLIB_API __declspec(dllimport)
#define MYDLLLIB_TEMPLATE extern
#endif
#else                       // Not windows --- probably *nix/bsd
#define MYDLLLIB_API
#ifdef MYDLLLIB_EXPORTS
#define MYDLLLIB_TEMPLATE
#else
#define MYDLLLIB_TEMPLATE extern
#endif
#endif // WIN32

编译 DLL 时,定义 MYDLLLIB_EXPORTS。然后在 DLL 中,您可以实例化您希望使用的每个 STL 类型,例如,字符串列表或 vector

MYDLLLIB_TEMPLATE template class MYDLLLIB_API std::vector<std::string>;
MYDLLLIB_TEMPLATE template class MYDLLLIB_API std::list<std::string>;

您的 DLL 的使用者(没有定义 MYDLLLIB_EXPORTS)将看到

extern template class __declspec(dllimport) std::vector<std::string>;

并使用从您的 DLL 导出的二进制代码,而不是实例化它们自己的代码。

关于c++ - 如何在 DLL 边界上公开 STL 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1881494/

相关文章:

c++ - AMD64 ABI 中的空类会怎样?

android - 以编程方式检索 Android ARM 处理器版本

c++ - 符号指针与常规符号查找的 ABI 稳定性

c++ - 使用新构造的派生对象的地址初始化基类数组的巧妙方法

c++ - 如何在 C++ 错误 C2338 中组织 map<set<multiset<int>>,int>

c++ - 关于 std::unordered_multimap 中键唯一性的保证

c++ - 对 std::unordered_map::reserve 的不必要或冗余调用的行为

c++ - 将参数 move 到数据成员 : Take parameter by copy or rvalue-ref?

c++ - 将字符串插入 JSON 模板

c++ - 在C++中,对象(如队列、映射)的名称是引用(还是指针)?