【发布时间】:2019-11-09 18:10:24
【问题描述】:
看起来std::string 是Community/VC/Tools/MSVC/?/include/xstring 处的仅标头文件,并且所有生成的代码都应包含在构建目标中。
如果我是对的,微软如何保证下一个 Visual Studio 版本不会改变xstring 和std::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 级和1 个内部结构。当我们在应用程序代码中时,我们有级别 0 和另一个内部结构。我们将具有一种内部结构的对象分配给具有另一种内部结构的对象。
不管怎样,现在我对一些内部结构有了更好的了解。
【问题讨论】:
-
您应该依赖 ISO C++ 标准所说的 std::string 应该是什么样的。 (如果你不想阅读标准,this 应该足够好了)
-
你为什么在乎?
-
很多反对票,但我可以说出我为什么有趣。成像我们使用 Visual Studio 14 将一些代码编译到 DLL 库中,我们使用
std::string。现在我们想将此库与 Visual Studio 15 代码一起使用,并且在xstring文件中进行了更改。我们如何保证如果我们从该库中调用函数并将结果分配给输出代码中的字符串,它将起作用? -
How we could guaranty that if we call function from that library and assign result to string in out code it will work?- 这应该是问题本身,您的实际问题类似于“std::string 对象是否保证在不同版本的 VS 之间是二进制兼容的?” (而不是暗示您指望代码的特定实现)。您甚至可能想删除它并重试。 -
老实说,我第一次读这个问题的印象是你不知道 C++ 标准和 Visual Studio 之间的区别。但是,如果您改写它以阐明您正在寻找什么(即二进制兼容性、构建系统可移植性、通过 Visual Studio 版本的解决方案文件的稳定性),这将立即成为一个更有趣的问题。
标签: c++ qt visual-c++