int main()
{
return -1;
}
Взяв, например, приведенный выше простой код, в main, если нет ошибок, верните 0; если есть ошибка, верните -1. Но почему g++ не показывает никаких ошибок или сообщений после выполнения? В то время как в Xcode отображается «Программа завершилась с кодом выхода: 255», что я могу сказать что-то не так. или, может быть, вопрос: в g++, как я могу сказать main с некоторой ошибкой и вернуть ненулевое значение?
Спасибо.
g++ только компилирует вашу программу. -1 возвращается при запуске.
В оболочке переменная $?
имеет статус выхода последней запущенной команды. Итак ./a.out; echo $?
Возврат 0 в случае успеха и других значений в случае ошибки является соглашением. Нет определения того, что происходит после того, как main()
возвращает какое-то значение. Как правило, то, что происходит, зависит от того, как запускается программа (например, если сценарий запускает программу, он может получить возвращаемое значение из main()
и делать все, что ему нравится, когда он получает какое-либо конкретное возвращаемое значение.
Это поможет ответить на ваш вопрос? stackoverflow.com/questions/5149228/…
Обратите внимание, что возврат отрицательного значения из main редко является тем, что вам нужно. Вы часто хотите просто использовать макросы EXIT_SUCCESS
и EXIT_FAILURE
в качестве возвращаемого значения.
@Питер Спасибо; так что это просто условность. При выполнении main это означает только возврат значения, независимо от того, какое значение. Когда происходит ошибка, мы просто выдаем сообщение, а возвращаемое значение обозначает ошибку. С точки зрения main это означает только завершение выполнения и возврат значения. Я правильно понимаю?
Спасибо всем за помощь, очень ценю это.
@Бонни - более или менее. С точки зрения main()
он возвращает значение, а возвращаемое значение не имеет значения. Именно среда, которая получает возвращаемое значение, интерпретирует это значение. Естественно, программист может придать некоторое значение каждому выбранному возвращаемому значению способом, который (надеюсь) согласуется с тем, что делает с ним хост-среда.
Спасибо @Peter за подробное объяснение.
(развивая то, что уже было намекнуто в комментариях)
C++ - это (обычно) компилируемый язык. (Хотя интерпретаторы тоже существуют, XCode с clang или gcc к ним не относятся.)
исходный код (представленный OP) компилируется в Машинный код, исполняемый ЦПУ. (Обычно это процессор, на котором работает компилятор, но это может быть и для другого → кросс-компиляция.) Машинный код представляет собой двоичный код (трудночитаемый обычным пользователем), который является единственным кодом, который может быть непосредственно «интерпретирован» ЦП.
Созданный исполняемый файл должен быть запущен с использованием определенных функций ОС (например, fork()
и exec()
). Оболочка (например, bash
) может это сделать, но ее также можно запрограммировать в другие программы.
IDE (например, XCode или VisualStudio) предоставляют команды (кнопки) для компиляции и запуска. Кнопка «Воспроизвести» проверяет, был ли исходный код изменен с момента последней компиляции. Если это так, он снова компилируется, а результат сохраняется в виде исполняемого файла. (В противном случае компиляция может быть пропущена.) После этого (при условии отсутствия ошибок компиляции) IDE превращает процесс в исполняемый файл (то есть скомпилированную программу).
Когда программа завершается, она возвращает число, которое может быть получено в родительском процессе (который запустил программу). Если родительский процесс был, например. fork()
то код возврата сохраняется в переменной, которую впоследствии можно получить.
echo $?
печатает возвращенное значение последнего завершенного дочернего процесса.
IDE может сообщать о возвращенном значении в каком-либо окне журнала. В VisualStudio это окно вывода. Как описано в вопросе OP, в XCode это похоже.
Существует несколько интерпретаторов C++. Одним из них, например, является Cling, который построен на основе библиотек Clang и LLVM. Он может анализировать все, что может Clang, а также некоторые дополнительные специальные (специфичные для интерпретатора) расширения.
@Питер Оха. (Я не знал об этом.) Однако, по крайней мере, XCode с clang или gcc не должен принадлежать им, AFAIK.
@Scheff Спасибо, это ясно. Да, Xcode и gcc используют разные библиотеки. Насколько я понимаю: мы позволяем main возвращать значение, оно будет автоматически сохранено в скрытой переменной, поэтому нам нужно «отобразить» его. Здесь нет синтаксической ошибки, но нам нужно добавить некоторую обработку, если «-1» определено как код ошибки.
@Bonnie Если вы скомпилируете свое приложение с помощью gcc
в командной строке (например, в bash
), оно просто скомпилируется, но не запустится. return -1;
— это просто оператор, «запеченный» в вашем исполняемом коде. Если вы запустите его (в bash
), он вернется с этим кодом. Чтобы сделать его видимым, можно использовать команду echo $?
. $?
— это переменная bash
, предоставляющая код выхода последней вызванной программы. В XCode есть команда компиляции и команда запуска. Команда run компилирует исходный код, если это необходимо, и запускает ваше приложение (в случае успеха). Если программа завершается, XCode выводит возвращенный код выхода.
Спасибо @Шефф. Кажется, они оба обрабатывают возвращаемое значение -1 одинаково.
Итак... вы просто компилируете свою программу как
g++ main.cpp
?