Uso della funzione exit ()


99

Voglio sapere come e quando posso usare la exit()funzione come il programma nel mio libro:

#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");
}

Quando lo eseguo, mostra ERRORE: chiamata a una funzione non definita exit () .

Inoltre, voglio sapere come posso creare un'opzione per chiudere la finestra in cui viene eseguito il programma? Ad esempio, ho creato un programma basato su menu che aveva diverse opzioni e una di queste era "esci dal menu" . Come posso fare in modo che esca dal programma (cioè chiuda la finestra)?


8
Se vuoi risposte, formatta il codice e la domanda in modo che le persone possano leggerli. E NON GRIDARE!

3
Il formato del codice è una cosa, ma è scritto male. Non vuoi risposte che assomigliano a questo, vero?
Kobi

53
oy! gotos ed esci? I miei occhi! Bruciano!
Kyle

8
Non sono C-Expert né posso scriverlo senza difficoltà, quindi potrei sbagliarmi su questo ... ma posso suggerire di buttare via quel libro? Usare goto in C è come ... come ... non lo so. E se ora mi scusi, hanno capito come aprire le porte * si nasconde.nella. cucina * ...
Bobby

8
Bene, goto è ancora una sintassi valida in C. Potrebbe essere disapprovata stilisticamente , ma è ancora valida. void main()OTOH è semplicemente sbagliato . Proprio come exit();è sbagliato, e omettere #include <stdlib.h>è sbagliato.
wildplasser

Risposte:


165

Prova a usare exit(0);invece. La exitfunzione prevede un parametro intero. E non dimenticare di farlo #include <stdlib.h>.


2
La pagina man dice "` `L'uso di EXIT_SUCCESS e EXIT_FAILURE è leggermente più portabile (in ambienti non UNIX) rispetto all'uso di 0 e alcuni valori diversi da zero come 1 o -1." "
Mawg dice reinstate Monica

82

La exitfunzione è dichiarata nell'intestazione stdlib, quindi è necessario avere

#include <stdlib.h>

nella parte superiore del programma per poter utilizzare exit.

Nota anche che exitaccetta un argomento intero, quindi non puoi chiamarlo come exit(), devi chiamare come exit(0)o exit(42). 0 di solito indica che il programma è stato completato correttamente e i valori diversi da zero vengono utilizzati come codici di errore.

Ci sono anche macro predefinite EXIT_SUCCESSe EXIT_FAILURE, ad esexit(EXIT_SUCCESS);


3
+1 per non solo menzionare che exitaccetta un argomento intero, ma anche per spiegare perché richiede un argomento intero e che alcuni compilatori richiedono l'esplicito #include <stdlib.h>.
Variadismo

Le macro predefinite menzionate vengono definite in fase di compilazione, non è vero?
carloswm85

11

exit(int code);è dichiarato in stdlib.hquindi è necessario un file

#include <stdlib.h>

Inoltre:
- Non hai parametri per exit(), è necessario intfornirne uno.
- Masterizza questo libro, usa il gotoche è (per tutti tranne che per gli hacker del kernel Linux) cattivo, molto, molto , MOLTO cattivo.

Modifica:
Oh, e

void main()

è anche un male, è:

int main(int argc, char *argv[])

sì, è scritto nel libro che è meglio che tu non usi goto bt per la completezza del libro, ti sto solo dando un esempio ... quindi il libro non è poi così male !!
Kraken

5
gotoa volte è la cosa giusta da fare (e il kernel Linux ne fornisce molti esempi, ma non è l'unico codice che può usarlo). Ma l'esempio di OP chiaramente non è uno di quei casi, quindi sì, quel libro dovrebbe essere bruciato :).
Adam Rosenfield

11

Prova ad uscire dall'uomo .


Oh e:

#include <stdlib.h>

int main(void) {
  /*  ...  */
  if (error_occured) {
    return (EXIT_FAILURE);
  }
  /*  ...  */
  return (EXIT_SUCCESS);
}

Più specificamente, prova "man 2 exit" da una console. I documenti c sono piuttosto dettagliati.
Justin

Hai ragione @Bertrand Marron
Justin,

7

La exit()funzione è un tipo di funzione con un tipo restituito senza un argomento. È definito dal file di intestazione stdlib.

Devi usare ( exit(0) or exit(EXIT_SUCCESS))o (exit(non-zero)o exit(EXIT_FAILURE) ).


4

L'esempio seguente mostra l'utilizzo della exit()funzione.

#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;
}

Produzione

Avvio del programma ...
Uscita dal programma ...


2

È necessario aggiungere una riga con #include <stdlib.h>per includere quel file di intestazione e exitrestituire un valore, quindi assegnare un numero intero in exit(any_integer).


2

Oltre a restituire un codice di uscita al processo genitore -

In UNIX, un aspetto importante che penso sia stato tralasciato è che exit () alla prima chiamata (in ordine inverso) tutte quelle funzioni, che sono state registrate dalla chiamata atexit ().

Fare riferimento a SUSv4 per i dettagli.


1

su unix come l'uscita dei sistemi operativi appartiene al gruppo di chiamate di sistema. le chiamate di sistema sono chiamate speciali che consentono al codice utente (il tuo codice) di chiamare il codice del kernel. quindi la chiamata di uscita esegue alcune azioni di pulizia specifiche del sistema operativo prima di restituire il controllo al sistema operativo, termina il programma.

#include <stdlib.h>

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

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

Alcuni compilatori ti daranno lo stesso codice operativo da entrambi questi esempi, ma altri no. Ad esempio, il codice operativo della prima funzione non includerà alcun tipo di codice operativo di posizionamento dello stack che verrà incluso nel secondo esempio come per qualsiasi altra funzione. Potresti compilare entrambi gli esempi e smontarli e vedrai la differenza.

Puoi usare exit da qualsiasi parte del tuo codice e assicurarti che il processo termini. Non dimenticare di includere il parametro intero.


-2

Scrivi il file di intestazione #include<process.h>e sostituiscilo exit();con exit(0);. Questo funzionerà sicuramente in Turbo C; per altri compilatori che non conosco.


1
<process.h> "non è standard. La exitfunzione è dichiarata in <stdlib.h>.
Keith Thompson

<process.h> non risolverà questo problema. Hai capito la domanda che ti viene posta?
CuriousMind

-3

Cattiva pratica di programmazione. L'uso di una funzione goto è un completo no no nella programmazione C.
Includere anche il file di intestazione stdlib.h scrivendo #include <iostream.h>per l'utilizzo della exit()funzione. Ricorda anche che la funzione exit () accetta un argomento intero. Utilizzare exit(0)se il programma è stato completato correttamente e / exit(-1)o uscire dalla funzione con un valore diverso da zero come argomento se il programma ha un errore.


1
<iostream.h>è specifico di C ++ e non è correlato all'intestazione <stdlib.h>effettivamente necessaria. Gli argomenti solo portatili alla exitfunzione sono 0, EXIT_SUCCESSe EXIT_FAILURE. L'utilizzo di qualsiasi valore diverso da zero per indicare un errore è specifico per i sistemi tipo UNIX (e probabilmente alcuni altri); non fare affidamento su di esso nel codice portatile.
Keith Thompson

-4

Includere stdlib.hnell'intestazione e quindi chiamare abort();in qualsiasi punto si desideri uscire dal programma. Come questo:

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

Quando l'utente entra nell'interruttore, accetta questo e lo consegna al caso 3 in cui chiami la abortfunzione. Uscirà dallo schermo immediatamente dopo aver premuto il tasto Invio.


6
abortnon è la cosa appropriata da chiamare qui, non chiamerà i atexitgestori né svuoterà i buffer dei file aperti. Deve essere utilizzato solo per la chiusura anomala del programma, ad es. Asserzioni non riuscite, ecc. Per la normale chiusura del programma, exitdeve essere utilizzato.
Adam Rosenfield

-6

Usa process.h invece di stdlib e iostream ... Funzionerà al 100%.


4
Non so cosa sia process.h; non è certamente il C standard e non funzionerà su sistemi che non lo forniscono. L' <iostream>intestazione è specifica di C ++; la domanda riguarda C.
Keith Thompson

1
Questo non è Yahoo! Risposte, è Stack Overflow. Se rispondi, devi prima provarlo almeno!
wizzwizz4
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.