Подтвердить что ты не робот

С++: Является ли все "std" кросс-платформой?

Я продолжаю пробовать разные условия поиска для этого вопроса, и я просто нахожу шум как в Google, так и в stackoverflow. Если я пишу код, используя стандартную библиотеку С++ (std), все это в принципе гарантируется для компиляции для Windows, Mac и Linux (и, надеюсь, работаем по назначению)?

4b9b3361

Ответ 1

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

Здесь несколько стандартов - С++ 98, С++ 03, С++ 11, С++ 14, С++ 17 и работа началась на С++ 20. Иногда функции в последнем текущем стандарте не будут реализованы в каждом компиляторе. Если вы придерживаетесь С++ 03, вы должны найти широкое соответствие.

Все в пространстве имен std должно быть частью стандарта по определению.

Ответ 2

Код гарантированно совместим со всеми компиляторами/платформами, совместимыми со стандартами, но важно отметить, что ABI не является, то есть вы не можете считать безопасным ссылку на файлы, созданные из разных компиляторов/версий/платформ.

На практике это означает, что объекты STL, такие как string или vector, не передаются из одной библиотеки в другую, если вы не скомпилировали оба точно так же в одно и то же время. Это особенно важно при передаче указателей на динамические данные: вы не можете использовать shared_ptr в своих API-интерфейсах библиотеки, если вы не можете выполнить указанную гарантию, вместо этого вам нужно будет использовать обычные указатели.

Ответ 3

Аргумент состоит в том, что все, что не соответствует STL, не соответствует требованиям С++, и поэтому, в одном отношении, да, все STL являются кросс-платформенными.

Однако имейте в виду, что часть STL разрешена для реализации. Например, см. type_info:: name