在库API中传递std :: string

时间:2010-07-02 16:43:01

标签: c++ stl std

我们目前正在为某个库构建API。 部分接口需要库来获取并返回用户类,例如vector和string。

当尝试在简单场景中模拟库的使用时,在调试模式下,系统会在将字符串作为输入时粉碎。

我相信在调试或发布模式下字符串类有不同的表示形式。然后我们的图书馆假定接收某个表示,不正确地读取数据成员并沿途碾碎。 那么在API中传输STL对象的最佳方法是什么呢? 目标操作系统是使用MSVC 8编译的Windows XP,尽管库用户将使用他们的编译器可能(并且可能会)不同的Windows 我们到目前为止的想法:

  1. 将字符串更改为char * - 但是开发人员可能会对释放内存的责任感到困惑。
  2. 使用我们自己的String版本 - 我不想开发另一个字符串的私有实现。
  3. 发布给用户调试版和发行版。
  4. 询问堆栈溢出的人是否有我们想念或不理解的选项,或只是听取他们的经验 - 完成。

2 个答案:

答案 0 :(得分:7)

让人们在调试模式下与调试链接并在发布模式下发布并不是不合理的。这就是几乎每个图书馆都能做到的。甚至像DirectX这样的大型项目都会发布调试其二进制文件的编译。 #3是一个非常合理的选择/解决方案。

答案 1 :(得分:6)

您应该避免在不同的二进制模块之间传递STL对象。

对于字符串,您必须依赖const char*作为只读参数,char*, <buffer size>作为输入参数...

对于向量,可能会有点困难,特别是如果你必须改变向量的内容......

关于您的想法:

  1. 你是对的,但惯例通常是你不能存储传递的指针(你必须做你的本地副本)。
  2. 最后,除非您在实现的调试和发布版本上具有相同的二进制表示,否则您将遇到相同的问题。
  3. 如果您在两个二进制模块中使用不同的STL版本/实现,这可能会有害(除非您确定库用户将使用相同的STL)。