Я продолжаю пробовать разные условия поиска для этого вопроса, и я просто нахожу шум как в Google, так и в stackoverflow. Если я пишу код, используя стандартную библиотеку С++ (std), все это в принципе гарантируется для компиляции для Windows, Mac и Linux (и, надеюсь, работаем по назначению)?
С++: Является ли все "std" кросс-платформой?
Ответ 1
Стандарт определяет, что значит быть компилятором С++, и все компиляторы, утверждающие, что это С++, должны соответствовать стандарту; любые, которые не могут считаться ошибочными. Все основные компиляторы стараются соответствовать друг другу.
Здесь несколько стандартов - С++ 98, С++ 03, С++ 11, С++ 14, С++ 17 и работа началась на С++ 20. Иногда функции в последнем текущем стандарте не будут реализованы в каждом компиляторе. Если вы придерживаетесь С++ 03, вы должны найти широкое соответствие.
Все в пространстве имен std
должно быть частью стандарта по определению.
Ответ 2
Код гарантированно совместим со всеми компиляторами/платформами, совместимыми со стандартами, но важно отметить, что ABI не является, то есть вы не можете считать безопасным ссылку на файлы, созданные из разных компиляторов/версий/платформ.
На практике это означает, что объекты STL, такие как string
или vector
, не передаются из одной библиотеки в другую, если вы не скомпилировали оба точно так же в одно и то же время. Это особенно важно при передаче указателей на динамические данные: вы не можете использовать shared_ptr
в своих API-интерфейсах библиотеки, если вы не можете выполнить указанную гарантию, вместо этого вам нужно будет использовать обычные указатели.
Ответ 3
Аргумент состоит в том, что все, что не соответствует STL, не соответствует требованиям С++, и поэтому, в одном отношении, да, все STL являются кросс-платформенными.
Однако имейте в виду, что часть STL разрешена для реализации. Например, см. type_info:: name