Итак, я знаю, что есть несколько версий C ++. И я не очень много знаю о различиях между ними, но мой вопрос:
Допустим, я сделал приложение на С ++ на языке С ++ 11 и отправил его на другой компьютер. Будет ли возникать ошибка в других версиях С ++ или он автоматически обнаружит его и запустит с этой версией?
Или я ошибаюсь и это определяется во время компиляции? Кто-то, пожалуйста, скажите мне, потому что я еще не нашел ни одного ответа на мой вопрос в Google.
Это зависит от того, скопируете ли вы исходный код на другой компьютер и скомпилируете его там, или скомпилируете его на своем компьютере и отправите полученный бинарный файл на другой компьютер.
C ++ переводится компилятором в машинный код, который работает непосредственно на процессоре. Любой компьютер с совместимым процессором поймет машинный код, но это еще не все. Программа должна взаимодействовать с файловой системой, графическими адаптерами и так далее. Эта часть, как правило, обрабатывается операционной системой по-разному. Даже если часть этого абстрагируется библиотеками C ++, обращения к операционной системе различны и специфичны для нее.
Например, скомпилированный двоичный файл для Ubuntu не будет работать в Windows, даже если оба компьютера имеют одинаковый процессор и оборудование.
Если вы скопируете исходный код на другой компьютер и скомпилируете его там (или используете кросс-компилятор), ваша программа должна скомпилироваться и нормально работать, если вы не используете специфичные для ОС функции.
Версия C ++ имеет значение для компиляции, конечно, вам нужен компилятор с поддержкой C ++ 11, если у вас есть исходный код C ++ 11, но как только программа скомпилирована, это уже не имеет значения.
C ++ компилируется в машинный код, который затем запускается на любом компьютере с такой архитектурой, например i386 или x64 (за исключением функций процессора, таких как SSE и т. д.).
Для Java, чтобы привести контрпример, это другое. Там код компилируется в формат байт-кода, который не зависит от машины. Этот формат байт-кода читается / понимается виртуальной машиной Java (JVM). В этом случае JVM должна быть доступна для вашей архитектуры, и должна быть установлена правильная версия.
Или я ошибаюсь и это определяется во время компиляции?
Это как раз та идея: код компилируется, и после этого языковая версия практически не имеет значения. Единственный возможный подводный камень был бы, если бы новая версия C ++ включала бы принципиально новые изменения в стандартную библиотеку C ++ (библиотеку, а не сам язык!). Однако, поскольку подавляющее большинство этой библиотеки является шаблоном кода, она все равно компилируется вместе с вашим собственным кодом. Это в основном запекается в вашем .exe
файл вместе с вашим собственным кодом, так что он так же переносим, как ваш. Кроме того, дизайнеры C и C ++ проявляют большую осторожность не сломать старый код; так что вы можете ожидать, что даже те части, которые предоставляются самой системой (стандартной библиотекой C), ничего не сломают.
Таким образом, хотя в теории есть вещи, которые могут сломаться, чистый код C ++ должен нормально работать на всех машинах, которые понимают одно и то же .exe
формат как машина, на которой он был скомпилирован.