2016-11-28 9 views
2

Итак, я знаю, что существует несколько версий C++. И я действительно не очень разбираюсь в различиях между ними, но мой вопрос:
Допустим, я сделал приложение C++ в C++ 11 и отправил его на другой компьютер, если бы он придумал ошибки из других версий C++ или автоматически обнаружить его и запустить с этой версией?
Или я получаю это неправильно и определяется ли это во время компиляции? Кто-то, пожалуйста, скажите мне, потому что я еще не нашел ни одного ответа на свой вопрос в Google.C++ Версии, они автоматически обнаруживают версию exe?

+7

приложение составлено и автономно. Вам не нужен C++ для запуска C++-скомпилированной программы, в отличие от java или python. –

ответ

6

Это зависит от того, скопируете ли вы исходный код на другой компьютер и скомпилируете его там, или если вы скомпилируете его на своем компьютере и отправите полученный двоичный файл на другой компьютер.

C++ преобразуется компилятором в машинный код, который запускается непосредственно на процессоре. Любой компьютер с совместимым процессором будет понимать машинный код, но есть нечто большее. Программа должна взаимодействовать с файловой системой, графическими адаптерами и т. Д. Разумеется, эта часть обычно обрабатывается операционной системой. Даже если некоторые из них абстрагируются библиотеками C++, вызовы операционной системы различны и специфичны для нее.

Скомпилированный двоичный файл для ubuntu не будет работать в Windows, например, даже если оба компьютера имеют один и тот же процессор и оборудование.

Если вы копируете исходный код на другой компьютер и компилируете его там (или используете кросс-компилятор), ваша программа должна скомпилироваться и работать нормально, если вы не используете функции, специфичные для ОС.

Версия C++ имеет значение для компиляции, вам нужен C++ 11-совместимый компилятор, конечно, если у вас есть исходный код C++ 11, но как только программа скомпилирована, это уже не имеет значения.

+0

Ничего. На самом деле, я просто спросил себя, почему он поймал этот downvote, прежде чем нажать кнопку upvote :-) – cmaster

+0

Спасибо, мне всегда любопытно о downvotes. – alain

5

C++ скомпилирован в машинный код, который затем запускается на любом компьютере, имеющем такую ​​архитектуру, например. i386 или x64 (вставка функций процессора, таких как SSE и т. д.).

Для Java, для приведения контрпримера, это другое. Там код компилируется в формат байт-кода, который не зависит от машины. Этот байт-код читается/понимается виртуальной машиной Java (JVM). Затем JVM должен быть доступен для вашей архитектуры и должна быть установлена ​​правильная версия.

+2

Существуют также различия в ОС, которые могут нарушать вещи: ABI стандартной библиотеки C, например. Вот почему вы не можете просто взять исполняемый файл linux и запустить его на компьютере под управлением Windows, хотя эта машина может работать даже на одном и том же оборудовании. Вы должны, по крайней мере, ограничить область применения машинами, которые понимают один и тот же исполняемый формат. – cmaster

+0

Это верно только в том случае, если вы компилируете на определенную ОС для этой ОС. Однако есть другие способы получить код в памяти. Вы можете писать загрузчики, биосы, прошивки, ОС и т. Д. После загрузки кода он может запускаться независимо от версии C++. – Espen

+0

@ Espen Однако такой код не имеет доступа к стандартной библиотеке C и, следовательно, ко всем частям стандартной библиотеки C++, которые полагаются на стандартную библиотеку C. Такие вещи, как ввод-вывод файлов, потоки и 'malloc()', нелегко реализовать, не полагаясь на ядро. Таким образом, хотя, безусловно, можно написать такой код из чистой необходимости (ядра должны быть написаны на * некоторых * языках), можно утверждать, что это не действительно код C/C++: он должен быть написан с использованием определенных подмножеств языков и на этом уровне он должен обычно включать биты ассемблера, перемещая его довольно далеко от стандартного C/C++. – cmaster

5

Или я получаю это неправильно и определяется ли оно во время компиляции?

Это как раз идея: код скомпилирован, и после этого языковая версия почти не имеет значения. Единственная возможная ошибка была бы в том случае, если новая версия C++ включала бы разбивку на стандартную библиотеку C++ (библиотека, а не сам язык!). Однако, поскольку подавляющее большинство этой библиотеки является кодом шаблона, оно также составлено вместе с вашим собственным кодом. Это в основном запекается в ваш файл .exe вместе с вашим собственным кодом, поэтому он настолько же портативен, как и ваш. Кроме того, разработчики C и C++ проявляют большую заботу не, чтобы сломать старый код; поэтому вы можете ожидать даже те части, которые предоставляются самой системой (стандартная библиотека C), чтобы ничего не сломать.

Таким образом, несмотря на то, что существуют теории, которые могут нарушаться теоретически, чистый код на C++ должен отлично работать на всех машинах, которые понимают тот же формат .exe, что и машина, на которой она была скомпилирована.