Почему g++ не возвращает ошибку при возврате -1

int main()
{
    return -1;
}

Взяв, например, приведенный выше простой код, в main, если нет ошибок, верните 0; если есть ошибка, верните -1. Но почему g++ не показывает никаких ошибок или сообщений после выполнения? В то время как в Xcode отображается «Программа завершилась с кодом выхода: 255», что я могу сказать что-то не так. или, может быть, вопрос: в g++, как я могу сказать main с некоторой ошибкой и вернуть ненулевое значение?

Спасибо.

Итак... вы просто компилируете свою программу как g++ main.cpp?

StoryTeller - Unslander Monica 07.04.2019 09:18

g++ только компилирует вашу программу. -1 возвращается при запуске.

interjay 07.04.2019 09:20

В оболочке переменная $? имеет статус выхода последней запущенной команды. Итак ./a.out; echo $?

Shawn 07.04.2019 09:23

Возврат 0 в случае успеха и других значений в случае ошибки является соглашением. Нет определения того, что происходит после того, как main() возвращает какое-то значение. Как правило, то, что происходит, зависит от того, как запускается программа (например, если сценарий запускает программу, он может получить возвращаемое значение из main() и делать все, что ему нравится, когда он получает какое-либо конкретное возвращаемое значение.

Peter 07.04.2019 09:44

Это поможет ответить на ваш вопрос? stackoverflow.com/questions/5149228/…

John Zwinck 07.04.2019 09:45

Обратите внимание, что возврат отрицательного значения из main редко является тем, что вам нужно. Вы часто хотите просто использовать макросы EXIT_SUCCESS и EXIT_FAILURE в качестве возвращаемого значения.

Jesper Juhl 07.04.2019 09:56

@Питер Спасибо; так что это просто условность. При выполнении main это означает только возврат значения, независимо от того, какое значение. Когда происходит ошибка, мы просто выдаем сообщение, а возвращаемое значение обозначает ошибку. С точки зрения main это означает только завершение выполнения и возврат значения. Я правильно понимаю?

Bonnie 10.04.2019 06:37

Спасибо всем за помощь, очень ценю это.

Bonnie 10.04.2019 06:46

@Бонни - более или менее. С точки зрения main() он возвращает значение, а возвращаемое значение не имеет значения. Именно среда, которая получает возвращаемое значение, интерпретирует это значение. Естественно, программист может придать некоторое значение каждому выбранному возвращаемому значению способом, который (надеюсь) согласуется с тем, что делает с ним хост-среда.

Peter 10.04.2019 09:24

Спасибо @Peter за подробное объяснение.

Bonnie 19.04.2019 06:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
10
508
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

(развивая то, что уже было намекнуто в комментариях)

C++ - это (обычно) компилируемый язык. (Хотя интерпретаторы тоже существуют, XCode с clang или gcc к ним не относятся.)

исходный код (представленный OP) компилируется в Машинный код, исполняемый ЦПУ. (Обычно это процессор, на котором работает компилятор, но это может быть и для другого → кросс-компиляция.) Машинный код представляет собой двоичный код (трудночитаемый обычным пользователем), который является единственным кодом, который может быть непосредственно «интерпретирован» ЦП.

Созданный исполняемый файл должен быть запущен с использованием определенных функций ОС (например, fork() и exec()). Оболочка (например, bash) может это сделать, но ее также можно запрограммировать в другие программы.

IDE (например, XCode или VisualStudio) предоставляют команды (кнопки) для компиляции и запуска. Кнопка «Воспроизвести» проверяет, был ли исходный код изменен с момента последней компиляции. Если это так, он снова компилируется, а результат сохраняется в виде исполняемого файла. (В противном случае компиляция может быть пропущена.) После этого (при условии отсутствия ошибок компиляции) IDE превращает процесс в исполняемый файл (то есть скомпилированную программу).

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

echo $?

печатает возвращенное значение последнего завершенного дочернего процесса.

IDE может сообщать о возвращенном значении в каком-либо окне журнала. В VisualStudio это окно вывода. Как описано в вопросе OP, в XCode это похоже.

Существует несколько интерпретаторов C++. Одним из них, например, является Cling, который построен на основе библиотек Clang и LLVM. Он может анализировать все, что может Clang, а также некоторые дополнительные специальные (специфичные для интерпретатора) расширения.

Peter 07.04.2019 09:53

@Питер Оха. (Я не знал об этом.) Однако, по крайней мере, XCode с clang или gcc не должен принадлежать им, AFAIK.

Scheff's Cat 07.04.2019 09:55

@Scheff Спасибо, это ясно. Да, Xcode и gcc используют разные библиотеки. Насколько я понимаю: мы позволяем main возвращать значение, оно будет автоматически сохранено в скрытой переменной, поэтому нам нужно «отобразить» его. Здесь нет синтаксической ошибки, но нам нужно добавить некоторую обработку, если «-1» определено как код ошибки.

Bonnie 10.04.2019 06:18

@Bonnie Если вы скомпилируете свое приложение с помощью gcc в командной строке (например, в bash), оно просто скомпилируется, но не запустится. return -1; — это просто оператор, «запеченный» в вашем исполняемом коде. Если вы запустите его (в bash), он вернется с этим кодом. Чтобы сделать его видимым, можно использовать команду echo $?. $? — это переменная bash, предоставляющая код выхода последней вызванной программы. В XCode есть команда компиляции и команда запуска. Команда run компилирует исходный код, если это необходимо, и запускает ваше приложение (в случае успеха). Если программа завершается, XCode выводит возвращенный код выхода.

Scheff's Cat 10.04.2019 07:23

Спасибо @Шефф. Кажется, они оба обрабатывают возвращаемое значение -1 одинаково.

Bonnie 19.04.2019 07:02

Другие вопросы по теме