在库API中传递std :: string

Hag*_*gai 4 c++ stl std

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

在简单场景中尝试模拟库的使用时,在调试模式下,系统会在传递字符串作为输入时进行压缩.

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

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

Pup*_*ppy 7

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


lor*_*ova 6

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

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

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

关于你的想法:

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

  • @lorenzo我一直将字符串,向量等传递给静态库,没有任何问题.当然,必须使用与可执行文件相同的编译器编译库,但如果库和可执行文件共享内存管理职责,则对C代码也是如此. (3认同)