首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在我的dll界面或ABI中使用标准库(STL)类?

问如何在我的dll界面或ABI中使用标准库(STL)类?
EN

Stack Overflow用户
提问于 2018-05-17 07:52:22
回答 1查看 0关注 0票数 0

在导出包含stl类的类与Visual Studio警告C4251有关的几个问题之前:例如,这个问题或这个问题。我已经阅读了UnknownRoad的优秀解释。

包装所有这些std类并导出这些也不是真正的选择。毕竟它被称为标准模板库...也就是说,我们想要提供一个与这些标准类的接口。

如何在我的dll界面中使用stl-classes?

EN

回答 1

Stack Overflow用户

发布于 2018-05-17 17:41:01

这可以包括相同编译器的不同版本,甚至不同的补丁级别:

我如何在我的dll界面中使用stl-classes?

标准定义了每个STL类需要提供的方法和数据成员,并定义了这些方法要做的事情; 但没有更多。特别是,该标准没有指定编译器编写者应该如何实现标准定义的功能。编译器编写者可以自由提供一个STL类的实现,该类可以添加标准中未列出的成员函数和成员变量,只要标准中定义的那些成员仍然存在并执行标准所说的内容即可。

所述basic_string类在标准中定义为具有某些成员函数和变量。标准中的实际定义差不多是4页,但这只是其中的一小部分:

代码语言:javascript
复制
namespace std {
  template<class charT, class traits = char_traits<charT>,
    class Allocator = allocator<charT> >
  class basic_string {
[snip]
  public:
    // 21.3.3 capacity:
    size_type size() const;
    size_type length() const;
    size_type max_size() const;
    void resize(size_type n, charT c);
    void resize(size_type n);
    size_type capacity() const;
    void reserve(size_type res_arg = 0);
    void clear();
    bool empty() const;
[snip]
};

事实上,同一编译器的不同版本甚至补丁级别可能会改变这些实现细节。你不能依靠他们。所以,MSVC 10的实现可能如下所示:

代码语言:javascript
复制
namespace std {
  template<class charT, class traits = char_traits<charT>,
    class Allocator = allocator<charT> >
  class basic_string {
[snip]
char* m_pTheString;
};

size_t basic_string::size() const { return strlen(m_pTheString;) }

带有SP1的MSVC 10可能如下所示:

代码语言:javascript
复制
namespace std {
  template<class charT, class traits = char_traits<charT>,
    class Allocator = allocator<charT> >
  class basic_string {
[snip]
vector<char> m_TheString;
};

size_t basic_string::size() const { return m_TheString.size(); }

现在说你使用MSVC10来编写一个导出这个类的DLL:

代码语言:javascript
复制
class MyGizmo
{
public:
  std::string name_;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档