Есть ли строка кода, которая завершит работу программы?
Что-то вроде python sys.exit()
?
Есть ли строка кода, которая завершит работу программы?
Что-то вроде python sys.exit()
?
#include <cstdlib>
...
exit( exit_code );
Пока вы можете вызывать exit()
(и, возможно, это необходимо сделать, если ваше приложение встречает какую-то фатальную ошибку), самый чистый способ выхода из программы - вернуться из main()
:
int main()
{
// do whatever your program does
} // function returns and exits program
Когда вы вызываете exit()
, объекты с автоматической продолжительностью хранения (локальные переменные) не уничтожаются до того, как программа завершится, поэтому вы не получите правильную очистку. Этим объектам может потребоваться очистка всех имеющихся у них ресурсов, сохранение любых ожидающих изменений состояния, прекращение любых запущенных потоков или выполнение других действий для того, чтобы программа завершила чистоту.
Существует несколько способов прекратить выполнение вашей программы. Какой из них подходит, зависит от того, почему вы хотите завершить свою программу. Подавляющее большинство времени это должно быть, выполняя оператор возврата в вашей основной функции. Как и в следующем.
int main()
{
f();
return 0;
}
Как выяснили другие, это позволяет полностью уничтожить все ваши стековые переменные, чтобы правильно очистить их. Это очень важно.
Если вы обнаружили ошибку где-то глубоко в вашем коде, и вам нужно выйти, вы должны выбросить исключение, чтобы вернуться к основной функции. Как и в следующем.
struct stop_now_t { };
void f()
{
// ...
if (some_condition())
throw stop_now_t();
// ...
}
int main()
{
try {
f();
} catch (stop_now_t& stop) {
return 1;
}
return 0;
}
Это приводит к тому, что стек разматывается, и все ваши переменные стека будут уничтожены. Все еще очень важно. Обратите внимание, что указывать на отказ с ненулевым возвращаемым значением.
Если в маловероятном случае, когда ваша программа обнаруживает условие, указывающее, что более безопасно выполнять какие-либо инструкции, вы должны использовать std:: abort(). Это приведет к внезапной остановке вашей программы без дальнейшей обработки. std:: exit() аналогичен, но может вызывать обработчики atexit, которые могут быть плохими, если ваша программа достаточно подготовлена.
Да! exit()
. Это в <cstdlib>
.
Разрешение потоку выполнения оставить main
на возвращая значение или позволяющее исполнению достигнуть конца функции, - это путь, по которому программа должна завершиться, за исключением неустранимой обстоятельства. Возвращение значения необязательно в С++, но я обычно предпочитаю возвращать EXIT_SUCCESS
, найденный в cstdlib (значение для платформы, которое указывает, что программа выполнена успешно).
#include <cstdlib>
int main(int argc, char *argv[]) {
...
return EXIT_SUCCESS;
}
Если, однако, ваша программа достигает неустранимого состояния, она должна вызывать исключение. Однако важно осознать последствия этого. Нет общепринятых лучших практик для принятия решения о том, что должно или не должно быть исключением, но есть некоторые общие правила, о которых вы должны знать.
Например, бросание исключения из деструктора почти всегда является ужасной идеей, потому что уничтоженный объект может быть уничтожен, потому что уже было выбрано исключение. Если выбрано второе исключение, вызывается terminate
, и ваша программа будет остановлена без какой-либо последующей очистки. Вы можете использовать uncaught_exception
, чтобы определить, безопасно ли это, но обычно лучше никогда не позволять исключениям оставлять деструктор.
В то время как обычно вы всегда можете выполнять функции, которые вы вызываете, но не писали, чтобы генерировать исключения (например, new
будет бросать std::bad_alloc
, если он не может выделить достаточное количество памяти), часто начинающим программистам сложно поддерживать отслеживать или даже знать обо всех специальных правилах, связанных с исключениями на С++. По этой причине я рекомендую использовать их только в тех ситуациях, где нет разумного способа продолжить выполнение вашей программы.
#include <stdexcept>
#include <cstdlib>
#include <iostream>
int foo(int i) {
if (i != 5) {
throw std::runtime_error("foo: i is not 5!");
}
return i * 2;
}
int main(int argc, char *argv[]) {
try {
foo(3);
}
catch (const std::exception &e) {
std::cout << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
exit
является удержанием от C и может привести к тому, что объекты с автоматическим хранилищем не будут правильно очищены. abort
и terminate
эффективно заставляют программу совершать самоубийство и определенно не будут очищать ресурсы.
Независимо от того, что вы делаете, не используйте исключения, exit
или abort
/terminate
как костыль, чтобы разобраться в написании правильно структурированной программы. Сохраните их для исключительных ситуаций.
если вы в основном можете сделать:
return 0;
или
exit(exit_code);
Код выхода зависит от семантики вашего кода. 1 - ошибка 0 e нормальный выход.
В другой функции вашей программы:
exit(exit_code)
выйдет из программы.
В main() также есть:
return 0;
#include <cstdlib>
...
/*wherever you want it to end, e.g. in an if-statement:*/
if (T == 0)
{
exit(0);
}
Этот SO пост содержит ответ, а также объяснение, почему бы не использовать exit(). Стоит прочитать.
Короче говоря, вы должны вернуть 0 в main(), так как он запустит все деструкторы и выполнит очистку объекта. Бросок также будет работать, если вы выходите из ошибки.
вернуться к основному, который должен вернуть EXIT_FAILURE,
или std::terminate(), если поврежден.
(из комментария Мартина Йорка)
else if(Decision >= 3)
{
exit(0);
}
Выход (0);//в конце основной функции перед закрытием фигурных скобок
достаточно просто.
выход (0); }//конец функции
Убедитесь, что на обеих сторонах поля есть пробел. Без пробелов программа не останавливается.