C ++ STL和DLL

时间:2013-10-12 01:48:25

标签: c++ dll stl

我知道这个问题已经多次以类似的方式提出过,但我并不积极,我已经完全掌握了这里涉及的概念。我目前正在研究一些小的学习项目(因为我已经停止使用C ++了一段时间并希望重新使用它)而且从我读过的内容中,在DLL中使用STL时会遇到一些问题

然而,从我收集到的内容中,有两种方法可以避免可能出现的问题。

方法1:DLL的用户必须具有相同的编译器和相同的C运行时库。

方法2:隐藏所有STL类成员直接访问。

但是,当涉及方法2时,我知道客户端无法直接访问STL类成员以使此方法起作用,但这是否意味着:

//Note all the code in this example was written directly in my web broswer with no checking. 

#ifdef SAMPLEDLL_EXPORTS
#define SAMPLE_API __declspec(dllexport) 
#else
#define SAMPLE_API __declspec(dllimport) 
#endif

class SAMPLE_API SampleClass
{
  std::map<int, std::string> myMap;

  public:
  SampleClass();
  ~SampleClass();

   void addSomething(int in_Key, char* in_Val)
   {
     std::string s(in_Val);
     myMap.insert( std::pair<int, std::string>(in_Key, s) );
   };

   bool getHasKey(int in_Key)
   {
      return myMap.find(in_Key) != myMap.end(); 
   };

};

会起作用吗?

1 个答案:

答案 0 :(得分:1)

正如Hans Passant在评论中指出的那样,你的例子有点可疑,因为你把所有方法定义都内联了。但是我们假设您将定义移动到单独的.cpp文件中,然后将其构建到DLL中。

这不安全。

从一开始,我们就有了这个:

class SAMPLE_API SampleClass
{
  std::map<int, std::string> myMap;

我不需要进一步查看,因为我们可以立即看到SampleClass的大小取决于std :: map的大小,并且标准没有指定。因此,虽然你可以说SampleClass没有“公开”它的地图,但实际上它确实如此。您可以使用Pimpl技术来克服这个问题,并真正隐藏地图与您班级的ABI。