草庐IT

c++ - std::string header 仅在 Visual Studio 中吗?

coder 2024-02-09 原文

看起来 std::stringCommunity/VC/Tools/MSVC/?/include/xstring 中的一个头文件,所有生成的代码应该是包含在构建目标中。

如果我是对的,Microsoft 如何保证下一个 Visual Studio 版本不会更改 xstringstd::string 内部结构?

更新 1:

我对这个问题投了很多反对票,所以让我解释一下为什么我决定问这个问题。

我遇到了奇怪的崩溃,我不明白为什么会这样。 我使用最新的 Qt 5.13.0 (MSVC2017_x64),我还有一些用 Visual Studio 2017 编译的外部库。都有 /MDd,我用 dumpbin util 检查了这个。

当我尝试运行任何调用 Qt 库和 std::string 的代码时,我得到了错误的结果(并在最后崩溃)。

这是一个非常简单的例子:

#include <QApplication.h>

int main(int argc, char** argv) {
    QString s1("Test");
    std::string s2 = s1.toStdString(); // here we have s2 variable with wrong internal structure
    return 0;
}

我的想法是,QtCore DLL 库有 std::string,其内部结构与 Visual Studio 2017 的 std::string 不兼容。但是 Qt 是用 Visual 创建的Studio 2017(可能与我当前的 Visual Studio 不同,因为有几个次要版本),所以我决定在这里询问它们是否兼容。

更新 2:

问题出在 _ITERATOR_DEBUG_LEVEL 中。看起来 Qt 是用 2 级编译的,而我所有的外部库和应用程序都是用 0 级编译的。

此选项会影响许多 C++ 标准库类的内部结构并引入此类副作用。因此,当我们在 toStdString() 内部并创建 std::string 时,我们有第 2 层和一个内部结构。当我们在应用程序代码中时,我们有 0 级和另一个内部结构。我们将具有一个内部结构的对象分配给具有另一个内部结构的对象。

无论如何,现在我对一些内部结构有了更好的理解。

最佳答案

how does Microsoft guarantee that the next Visual Studio version doesn't change xstring and the std::string internal structure?

因为他们决定保证这一点,或者不保证这一点。

例如,Visual Studio 2015 to 2019 are binary compatible .

这是做出的决定,要做到这一点。结果,如果你说的是真的,那么该平台上 std::string 的一些实现细节被卡住了。这对图书馆来说并不罕见。 libstdc++'s std::list::size was non-compliant to C++11 for many years ,因为他们无法在不破坏二进制兼容性的情况下添加所需的成员变量。

简而言之,这基本上是一个项目管理决策,如果他们以破坏内容的方式更改 header ,他们会告诉您二进制兼容性已被破坏,您需要相应地重建和重新链接内容。

至于您的 Qt 问题,它确实闻起来像二进制兼容性问题。但是您说 Qt 和您的应用程序都是使用 /MDd 在 Visual Studio 2017 中构建的,这似乎排除了这种可能性。我会向 Qt 社区寻求进一步的帮助,可能会提供更多关于您的环境和您从哪里获得 Qt 的信息。还要确保您使用的是预期的 Qt 版本——也许有多个安装?哪个在您的包含路径中?

关于c++ - std::string header 仅在 Visual Studio 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56795807/

有关c++ - std::string header 仅在 Visual Studio 中吗?的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  4. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  5. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  6. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  7. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  8. ruby-on-rails - NameError(未初始化常量 Unzipper::Zip)但仅在 Heroku 部署(Rails)上 - 2

    我有一个类unzipper.rb,它使用Rubyzip解压文件。在我的本地环境中,我可以成功解压缩文件,而无需使用require'zip'明确包含依赖项但是在Heroku上,我得到一个NameError(uninitializedconstantUnzipper::Zip)我只能通过使用明确的require来解决问题:为什么这在H​​eroku环境中是必需的,但在本地主机上却不是?我的印象是Rails自动需要所有gem。app/services/unzipper.rbrequire'zip'#OnlyrequiredforHeroku.Workslocallywithout!class

  9. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

  10. ruby - Ruby 中字符串运算符 + 和 << 的区别 - 2

    我是Ruby和这个网站的新手。下面两个函数是不同的,一个在函数外修改变量,一个不修改。defm1(x)x我想确保我理解正确-当调用m1时,对str的引用被复制并传递给将其视为x的函数。运算符当调用m2时,对str的引用被复制并传递给将其视为x的函数。运算符+创建一个新字符串,赋值x=x+"4"只是将x重定向到新字符串,而原始str变量保持不变。对吧?谢谢 最佳答案 String#+::str+other_str→new_strConcatenation—ReturnsanewStringcontainingother_strconc

随机推荐