Использование функции exit ()

100

Я хочу знать, как и когда я могу использовать exit()функцию, подобную программе в моей книге:

#include<stdio.h>

void main()
{
    int goals;
    printf("enter number of goals scored");
    scanf("%d",&goals);

    if(goals<=5)
        goto sos;
    else
    {
        printf("hehe");
        exit( );
    }
    sos:
    printf("to err is human");
}

Когда я запускаю его, он показывает ERROR: call to undefined function exit () .

Кроме того, я хочу знать, как я могу создать опцию закрытия окна, в котором работает программа? Например, я создал программу, управляемую с помощью меню, в которой было несколько опций, одна из которых была «выйти из меню» . Как я могу заставить это выйти из программы (т.е. закрыть окно)?

Kraken
источник
8
Если вам нужны ответы, отформатируйте код и вопрос, чтобы люди могли их прочитать. И НЕ КРИЧИТЕ!
3
Формат кода - это одно, но он написан плохо. Вам же не нужны такие ответы, не так ли?
Коби
54
ой! gotos и выйти? Мои глаза! Они горят!
Кайл
8
Я не специалист по Си, и я не могу написать это без труда, поэтому могу ошибаться в этом ... но могу ли я предложить вам выбросить эту книгу? Использование goto в C похоже на ... как ... я не знаю. И если вы меня сейчас извините, они придумали, как открывать двери * hides.in.the.kitchen * ...
Бобби,
8
Что ж, goto по-прежнему является допустимым синтаксисом в C. Он может быть отклонен стилистически , но все еще действителен. void main()OTOH просто неправильно . Точно так exit();же неправильно, и опускать #include <stdlib.h>неправильно.
wildplasser

Ответы:

167

Попробуйте использовать exit(0);вместо этого. exitФункция ожидает целочисленный параметр. И не забывай #include <stdlib.h>.

Клаус Бысков Педерсен
источник
2
На странице руководства говорится: «Использование EXIT_SUCCESS и EXIT_FAILURE немного более переносимо (для сред, отличных от UNIX), чем использование 0 и некоторого ненулевого значения, такого как 1 или -1.« »
Мавг говорит, что Моника восстановлена
82

exitФункция объявлена в заголовке STDLIB, так что вы должны иметь

#include <stdlib.h>

в верхней части вашей программы, чтобы иметь возможность использовать exit.

Также обратите внимание, что он exitпринимает целочисленный аргумент, поэтому вы не можете называть его как exit(), вы должны вызывать как exit(0)или exit(42). 0 обычно означает, что ваша программа завершилась успешно, а ненулевые значения используются в качестве кодов ошибок.

Также есть предопределенные макросы EXIT_SUCCESSи EXIT_FAILURE, например,exit(EXIT_SUCCESS);

Тайлер МакГенри
источник
3
+1 за то, что не только упомянул, что exitпринимает целочисленный аргумент, но и объяснил, почему он принимает целочисленный аргумент и что некоторые компиляторы требуют явного #include <stdlib.h>.
Вариадизм
Упомянутые предопределенные макросы определяются во время компиляции, не так ли?
carloswm85
11

exit(int code);объявлен в, stdlib.hпоэтому вам нужен

#include <stdlib.h>

Также:
- У вас нет параметра для exit(), требуется intуказать его.
- Сожги эту книгу, она использует, gotoчто (для всех, кроме хакеров ядра Linux) плохо, очень, очень , ОЧЕНЬ плохо.

Изменить:
О, и

void main()

тоже плохо, это:

int main(int argc, char *argv[])
Морфилдур
источник
да, в книге написано, что лучше не использовать goto bt ради полноты книги, я просто привожу вам пример ... так что книга не так уж плоха !!
Kraken
5
gotoиногда бывает правильным (и ядро ​​Linux предоставляет множество примеров этого, но это не единственный код, который может его использовать). Но пример OP явно не из таких случаев, так что да, эту книгу следует сжечь :).
Адам Розенфилд
11

Попробуй мужик выйти .


Ой, и:

#include <stdlib.h>

int main(void) {
  /*  ...  */
  if (error_occured) {
    return (EXIT_FAILURE);
  }
  /*  ...  */
  return (EXIT_SUCCESS);
}
Бертран Маррон
источник
В частности, попробуйте "man 2 exit" с консоли. Документы c довольно подробны.
Джастин
Правильно, вы @Bertrand Marron
Джастин
7

exit()Функция представляет собой тип функции с типом возвращаемого значения без аргумента. Он определяется заголовочным файлом stdlib.

Вам нужно использовать ( exit(0) or exit(EXIT_SUCCESS))или (exit(non-zero)или exit(EXIT_FAILURE) ).

Натарадж Раджа
источник
4

В следующем примере показано использование exit()функции.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    printf("Start of the program....\n");
    printf("Exiting the program....\n");
    exit(0);
    printf("End of the program....\n");
    return 0;
}

Вывод

Запуск программы ....
Выход из программы ....

Мартин Макс
источник
2

Вы должны добавить строку с, #include <stdlib.h>чтобы включить этот файл заголовка, и exitдолжны вернуть значение, поэтому назначьте некоторое целое число в exit(any_integer).

user4508201
источник
2

В дополнение к возврату кода выхода родительскому процессу -

В UNIX важным аспектом, который, как мне кажется, был упущен, является то, что exit () сначала вызывает (в обратном порядке) все те функции, которые были зарегистрированы вызовом atexit ().

Пожалуйста, обратитесь к SUSv4 за подробностями.

конечная причина
источник
1

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

#include <stdlib.h>

// example 1
int main(int argc, char *argv){
  exit(EXIT_SUCCESS);
}

// example 2
int main(int argc, char *argv){
  return 0;
}

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

Вы можете использовать выход из любой части вашего кода и быть уверенным, что процесс завершится. Не забудьте указать целочисленный параметр.

Filvarga
источник
-2

Напишите заголовочный файл #include<process.h>и замените его exit();на exit(0);. Это определенно будет работать в Turbo C; для других компиляторов я не знаю.

Азим Альви
источник
1
<process.h> `нестандартен. exitФункция объявлена в <stdlib.h>.
Кейт Томпсон
<process.h> не решит эту проблему. Вы поняли заданный вопрос?
CuriousMind
-3

Плохая практика программирования. Использование функции goto - это полное запрещение программирования на C.
Также включите заголовочный файл stdlib.h, написав #include <iostream.h>для использования exit()функции. Также помните, что функция exit () принимает целочисленный аргумент. Используйте, exit(0)если программа завершилась успешно, и / exit(-1)или выходите из функции с любым ненулевым значением в качестве аргумента, если программа имеет ошибку.

Гаурав
источник
1
<iostream.h>специфичен для C ++ и не связан с <stdlib.h>действительно необходимым заголовком. Только портативные аргументы для exitфункции являются 0, EXIT_SUCCESSи EXIT_FAILURE. Использование любого ненулевого значения для обозначения сбоя характерно для UNIX-подобных систем (и, возможно, некоторых других); не полагайтесь на него в переносимом коде.
Кейт Томпсон
-4

Включите stdlib.hв свой заголовок, а затем позвоните abort();в любое место, где хотите выйти из программы. Как это:

switch(varName)
{
    case 1: 
     blah blah;
    case 2:
     blah blah;
    case 3:
     abort();
}

Когда пользователь входит, переключатель принимает это и передает его в случай 3, в котором вы вызываете abortфункцию. Он закроет ваш экран сразу после нажатия клавиши ввода.

Мухаммад Ахмад
источник
6
abortздесь не следует вызывать, он не будет вызывать atexitобработчики или сбрасывать буферы открытых файлов. Его следует использовать только для аварийного завершения программы, например, неудачных утверждений и т. Д. Для нормального завершения программы exitследует использовать.
Адам Розенфилд
-6

Используйте process.h вместо stdlib и iostream ... Он будет работать на 100%.

Детамос
источник
4
Я не знаю, что такое process.h; это, конечно, не стандартный C и не будет работать в системах, которые его не предоставляют. <iostream>Заголовка является специфическим для C ++; вопрос о С.
Кейт Томпсон,
1
Это не Yahoo! Ответы, это переполнение стека. Если вы ответите, вам нужно сначала хотя бы опробовать!
wizzwizz4