Похоже, std::string
- это файл только для заголовка в Community/VC/Tools/MSVC/?/include/xstring
, и весь сгенерированный код должен быть включен в цель сборки.
Если я прав, как Microsoft гарантирует, что следующая версия 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;
}
Моя идея заключалась в том, что библиотека DLL QtCore имеет std::string
с внутренней структурой, несовместимой с std::string
из Visual Studio 2017. Но Qt был создан с Visual Studio 2017 (возможно, не такой, как моя текущая Visual Studio, потому что было несколько незначительные выпуски), поэтому я решил спросить здесь, совместимы они или нет.
Обновление 2:
Проблема была в _ITERATOR_DEBUG_LEVEL
. Похоже, Qt был скомпилирован с уровнем 2, а все мои внешние библиотеки и приложения скомпилированы с уровнем 0.
Этот параметр влияет на внутреннюю структуру многих классов стандартных библиотек C ++ и создает такие побочные эффекты. Поэтому, когда мы внутри toStdString()
и создаем std::string
, у нас есть уровень 2 и одна внутренняя структура. Когда мы находимся в коде приложения, у нас есть уровень 0 и другая внутренняя структура. Мы присваиваем объект с одной внутренней структурой объекту с другим.
В любом случае, теперь я лучше понимаю некоторые внутренние элементы.