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