Является ли std :: string header только в Visual Studio? - PullRequest
5 голосов
/ 27 июня 2019

Похоже, 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 и другая внутренняя структура. Мы присваиваем объект с одной внутренней структурой объекту с другим.

В любом случае, теперь я лучше понимаю некоторые внутренние элементы.

Ответы [ 2 ]

5 голосов
/ 27 июня 2019

как Microsoft гарантирует, что следующая версия Visual Studio не изменит xstring и внутреннюю структуру std :: string?

Поскольку они принимают решение гарантировать это илиНе гарантируйте, что.

Например, Visual Studio с 2015 по 2019 год двоично совместимы .

Это решение, которое было принято, чтобы сделать это.В результате, если то, что вы говорите, верно, то некоторые особенности реализации std::string на этой платформе заморожены.Это не является необычным для библиотек. libstdc ++ std::list::size не был совместим с C ++ 11 в течение многих лет , поскольку они не могли добавить необходимую переменную-член без нарушения двоичной совместимости.

Короче говоря, это в основномрешение по управлению проектом, и если они когда-либо изменят заголовок таким образом, что это нарушит работу, они скажут вам, что двоичная совместимость была нарушена, и вам нужно соответственно перестроить и заново связать вещи.

Что касается вашей проблемы Qt, пахнет как бинарная проблема совместимости.Но вы говорите, что и Qt, и ваше приложение были созданы в Visual Studio 2017 с /MDd, что, похоже, исключает это.Я бы попросил сообщество Qt о дальнейшей помощи, возможно, с немного большей информацией о вашей среде и о том, где вы получили Qt.Также убедитесь, что вы используете версию Qt, которая предназначена - возможно, есть несколько установок?Какой из них находится на вашем пути включения?

4 голосов
/ 27 июня 2019

Является ли заголовок std :: string только в Visual Studio?

Не совсем, это также зависит от частей стандартной библиотеки C ++, которые реализованы в Microsoft Visual C ++ Runtime.Сборка двоичного файла с MSVC требует, чтобы среды выполнения VC ++ были связаны.Только статические библиотеки могут быть собраны без ссылки на среду выполнения, и тогда вы должны быть осторожны, чтобы не включать ни один из заголовков, требующих среды выполнения.

Is std :: stringзаголовок только в Visual Studio?

(я изначально читал заголовок таким образом.)

std::string является частью C ++ стандарта .Чтобы использовать std::string на любой платформе, поддерживающей стандарт C ++, вы должны использовать #include <string>.Это стандартный заголовок, доступный практически для любого компилятора C ++.

Хотя каждый компилятор или платформа может реализовать стандарт по-своему.Например, с MSVC вы можете видеть, что xstring - это то, как Microsoft реализует std::string под капотом .Если вы включаете xstring.h напрямую, вы пишете код, который зависит от версии MSVC, предоставляющей этот заголовок.Этот код не будет переносимым на другие компиляторы.

Если я прав, как Microsoft гарантирует, что следующая версия Visual Studio не изменит xstring и внутреннюю структуру std :: string?

Microsoft не гарантирует, что следующая версия Visual Studio будет иметь такую ​​же внутреннюю структуру std::string.В прошлом реализация стандартной библиотеки менялась с каждым выпуском среды выполнения VC ++, поэтому пользователи Windows заканчивают тем, что установили десятки версий среды выполнения VC ++ в своем списке «Установка и удаление программ».

К счастью, Microsoft предоставила намгарантия того, что Visual Studio 2015, 2017 и 2019 используют двоичную совместимую среду выполнения C ++.Это означает, что двоичные файлы, созданные с использованием стандартной библиотеки, представленной в Visual Studio 2015, совместимы с двоичными файлами, созданными также на 2017 и 2019 годы.Нет гарантии (пока), что будущая версия Visual Studio не изменит реализацию VC ++ во время выполнения снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...