Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在库API中传递std::string_C++_Stl_Std - Fatal编程技术网

C++ 在库API中传递std::string

C++ 在库API中传递std::string,c++,stl,std,C++,Stl,Std,我们目前正在为某个库构建API。 部分接口要求库获取并返回用户类,如vector和string 在一个简单的场景中尝试模拟库的使用时,在调试模式下,系统会在交付字符串作为输入时崩溃 我相信在调试或发布模式下,string类有不同的表示形式。然后,我们的库假设接收到某个表示,错误地读取数据成员,并一路挤压。 那么,在API中传输STL对象的最佳方法是什么呢。 目标操作系统是使用MSVC 8编译的windows XP,尽管库用户将使用windows,但他们的编译器可能会(也可能会)有所不同 到目前为

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

在一个简单的场景中尝试模拟库的使用时,在调试模式下,系统会在交付字符串作为输入时崩溃

我相信在调试或发布模式下,string类有不同的表示形式。然后,我们的库假设接收到某个表示,错误地读取数据成员,并一路挤压。 那么,在API中传输STL对象的最佳方法是什么呢。 目标操作系统是使用MSVC 8编译的windows XP,尽管库用户将使用windows,但他们的编译器可能会(也可能会)有所不同 到目前为止,我们的想法是:

  • 将string更改为char*——但是开发人员可能会对释放内存的责任感到困惑
  • 使用我们自己的String版本——我不想开发String的另一个私有实现
  • 发布到用户调试版本和发布版本
  • 询问Stack overflow上的人一些我们错过或不理解的选项,或者只是从他们的经验中听到-完成

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

    对于字符串,只读参数必须依赖
    const char*
    ,输入参数必须依赖
    char*,

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

    关于你的想法:

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

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

    对于支持率较低的投票者:请添加解释性评论,以便我们了解问题所在…@lorenzo我始终将字符串、向量等传递给静态库,没有任何问题。当然,这些库必须使用与可执行文件相同的编译器进行编译,但如果库和可执行文件共享内存管理职责,则对于C代码也是如此。请稍微扩展一下Lorenzo的观点:您应该检查两者是否使用了与C运行时DLL完全相同的调试或非调试副本。“如果存在不匹配或其中任何一个是静态的,那么它就不起作用了。”@Lorenzo。实际上,并非如此——二进制ABI是由最流行的编译器和链接器强制执行的(如果是这个词的话)。系统调用(至少在Linux上)实际上是通过调用软件中断来调用的。@Neil:我不处理60年代的操作系统:-)笑话除外,在Windows中,系统调用是C函数,因此使用它的调用约定是事实上的标准ABI(您可以争辩说,即使在Windows上,实际的系统调用也是通过syscall ASM调用完成的,但开发人员不应该处理这个问题).你认为有不同的表示方式吗?或者你知道有不同的表示方式吗?@Neil:好的,你知道更多的信息吗?但是,即使发布和调试之间没有区别,在第三方IMHO使用的API中使用STL仍然是有问题的。如果你的库收到了对象,它将包含必须传递的数据。因此,没有释放内存数据的风险。@Neil:我相信。因为如果用户模拟代码的配置在释放时,一切都正常。如果您计算sizeof(String)在发行版和调试配置中,您将得到不同的结果。您没有明确说明您使用的是什么操作系统和工具链。每个人都猜测它是Windows+VisualC++。这可能是因为当您开始使用DLL时,Windows具有奇怪的内存管理语义,并且它还可以进行“调试”和“发布”链接不兼容的二进制文件。Unix通常没有这些问题-当然,我在API中编写了大量使用STL类型的库,从来没有遇到过问题。因此,也许你应该澄清一下什么是你的目标平台。@Lorenzo:你使用编译器的STL。如果你有一个像GCC这样的免费编译器,那么你就可以使用它ers更新。如果您有一个付费的、版本更高的编译器,如MSVC,您只需针对MSVC8、9、10进行编译。@DeadMG:但是如果您使用给定的编译器编译库,如果您导出STL对象,您将强制库的用户在其应用程序中使用相同的环境。@Lorenzo:库在CPU和类似的编译器之间不兼容。Once您有相同的目标,使用相同的编译器不是不合理的。@DeadMG:好的,所以我是库供应商(假设Windows和DLL)选择使用英特尔C++ 10编译器和SGI STL。剪刀不会知道我使用的是什么库和编译器,因为他将得到二进制模块。他将使用MSVC 7和STL STL。我的库导出STL字符串和向量,这两种实现兼容吗?@洛伦佐:这就是为什么你使用多数编译器来为你的平台使用的原因。MSVC Express是免费的。