Використання функції exit ()


99

Я хочу знати, як і коли я можу використовувати таку 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: виклик невизначеної функції exit () .

Також я хочу знати, як я можу створити опцію закрити вікно, в якому працює програма? Наприклад, я зробив програму, керовану меню, яка мала кілька варіантів, і одна з них - "вийти з меню" . Як я можу зробити цей вихід програмою (тобто закрити вікно)?


8
Якщо ви хочете відповіді, відформатуйте свій код і запитання, щоб люди могли його прочитати. І НЕ ПОВЕРНУТИСЯ!

3
Формат коду - це одне, але це написано погано. Ви не хочете відповідей, які виглядають так, правда?
Кобі

53
ой! gotos та вихід? Мої очі! Вони горять!
Кайл

8
Я не C-експерт, і я не можу написати це без труднощів, тому, можливо, я помиляюся в цьому ... але чи можу я запропонувати вам викинути цю книгу? Використовувати goto на C - це як ... як ... я не знаю. І якщо ви вибачте мене зараз, вони придумали, як відкрити двері * hides.in.the.kitchen * ...
Боббі

8
Ну, goto все ще є дійсним синтаксисом у C. Він може бути відхилений стилістично , але він все ще дійсний. void main()OTOH - це просто неправильно . Так само як exit();і неправильно, а пропущення #include <stdlib.h>- неправильно.
wildplasser

Відповіді:


165

Спробуйте використовувати 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 заради повноти книги, просто даючи вам приклад ... так що книга не така погана !!
Кракен

5
gotoіноді є правильною справою (і ядро ​​Linux надає багато прикладів цього, але це не єдиний код, який може ним скористатися). Але приклад ОП, очевидно, не є одним із таких випадків, так що так, цю книгу слід спалити :).
Адам Розенфілд


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).


2

На додаток до повернення вихідного коду батьківському процесу -

У UNIX важливим аспектом, який, на мою думку, був опущений, є те, що вихід () при перших викликах (у зворотному порядку) всіх тих функцій, які були зареєстровані викликом 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;
}

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

Ви можете використовувати вихід з будь-якої частини коду та бути впевненим, що процес припиняється. Не забудьте включити цілий параметр.


-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функцію. Він вийде з вашого екрана відразу після натискання клавіші Enter.


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

-6

Використовуйте process.h замість stdlib та iostream ... Він буде працювати на 100%.


4
Я не знаю, що таке process.h; це, звичайно, не стандартний C, і він не працюватиме в системах, які його не забезпечують. <iostream>Заголовка є специфічним для C ++; питання про К.
Кіт Томпсон

1
Це не Yahoo! Відповіді, це Stack Overflow. Якщо ви відповідаєте, вам потрібно, принаймні, спершу перевірити це!
wizzwizz4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.