在导出包含与visual studio警告C4251相关的stl类的类之前,有一些问题:例如这个问题或这个问题.我已经阅读过UnknownRoad的优秀解释.
盲目地禁用警告似乎有点危险,尽管它可能是一种选择.包装所有这些std类并导出它们也不是一个真正的选择.它毕竟被称为标准模板库...即,想要提供这些标准类的接口.
如何在我的dll界面中使用stl-classes?什么是常见做法?
我有一个DLL,需要访问存储在主机应用程序中的STL容器中的数据.因为C++没有标准的ABI,并且我想支持不同的编译器,所以应用程序和DLL之间的接口基本上必须保持普通的旧数据.
对于向量,这是相对简单的.你可以简单地返回向量的内存块,因为它保证是有条件的:
// To return vector<int> data
virtual void GetVectorData(const int*& ptr, size_t& count) const
{
if (!vec.empty())
ptr = &(vec.front());
count = vec.size();
}
Run Code Online (Sandbox Code Playgroud)
现在,DLL可以通过该接口对向量的数据进行安全的只读访问.DLL也可以包装它以将内容复制到自身的向量中.
那么STL列表(和deques)呢?是否有另一种直接允许通过DLL边界访问的方法?或者我是否必须使用某种GetFirst()/ GetNext()接口?我可能需要为很多列表执行此操作,因此有一个像vector一样简单的解决方案会很好.
好的.....我已经完成了相关问题的所有阅读,以及一些MSDN文章,以及大约一天的谷歌搜索.
这个问题的当前"最新状态"回答是什么:
我正在使用VS 2008,C++非托管代码.我有一个包含相当多DLL和很多EXE的解决方案文件.只要我完全控制构建环境,使得所有的部件和部件都使用相同的标志构建,并使用相同的运行时库,并且没有人拥有静态链接的CRT库,我可以传递STL对象吗?
看起来这应该没问题,但根据您阅读的文章,有很多恐惧,不确定性和怀疑.
我知道在幕后产生静态数据的模板有各种各样的问题(每个dll都会得到自己的副本,导致心痛),但是常规旧STL怎么样?