Uso de la función exit ()

99

Quiero saber cómo y cuándo puedo usar la exit()función como el programa de mi 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");
}

Cuando lo ejecuto, muestra ERROR: llamada a la función no definida exit () .

Además, quiero saber cómo puedo crear una opción para cerrar la ventana en la que se ejecuta el programa. Por ejemplo, hice un programa basado en menús que tenía varias opciones y una de ellas era "salir del menú" . ¿Cómo puedo hacer que esto salga del programa (es decir, cerrar la ventana)?

Kraken
fuente
8
Si quieres respuestas, formatea tu código y pregunta para que la gente pueda leerlo. ¡Y NO GRITES!
3
El formato del código es una cosa, pero está mal escrito. No quieres respuestas que se vean así, ¿verdad?
Kobi
53
oy! gotos y salir? ¡Mis ojos! ¡Arden!
Kyle
8
No soy un C-Expert ni puedo escribirlo sin dificultad, así que puedo estar equivocado sobre esto ... pero ¿puedo sugerirle que tire ese libro? Usar goto en C es como ... como ... no lo sé. Y si me disculpan ahora, descubrieron cómo abrir puertas * se esconde.en.la.cocina * ...
Bobby
8
Bueno, goto sigue siendo una sintaxis válida en C. Puede que se desapruebe estilísticamente , pero sigue siendo válida. void main()OTOH está simplemente equivocado . Igual que exit();está mal, y omitir #include <stdlib.h>está mal.
wildplasser

Respuestas:

165

Intente usar en su exit(0);lugar. La exitfunción espera un parámetro entero. Y no te olvides de hacerlo #include <stdlib.h>.

Klaus Byskov Pedersen
fuente
2
La página de manual dice "` El uso de EXIT_SUCCESS y EXIT_FAILURE es un poco más portátil (a entornos que no son UNIX) que el uso de 0 y algún valor distinto de cero como 1 o -1. `"
Mawg dice reinstalar Monica
82

La exitfunción está declarada en el encabezado stdlib, por lo que debe tener

#include <stdlib.h>

en la parte superior de su programa para poder usarlo exit.

Tenga en cuenta también que exittoma un argumento entero, por lo que no puede llamarlo como exit(), debe llamar como exit(0)o exit(42). 0 generalmente significa que su programa se completó correctamente y los valores distintos de cero se utilizan como códigos de error.

También hay macros predefinidas EXIT_SUCCESSy EXIT_FAILURE, por ejemplo,exit(EXIT_SUCCESS);

Tyler McHenry
fuente
3
+1 por no solo mencionar que exittoma un argumento entero, sino explicar por qué toma un argumento entero y que algunos compiladores requieren el explícito #include <stdlib.h>.
Variadicismo
Las macros predefinidas mencionadas se definen en tiempo de compilación, ¿no es así?
carloswm85
11

exit(int code);está declarado en, stdlib.hpor lo que necesita un

#include <stdlib.h>

Además:
- No tiene ningún parámetro para el exit(), es necesario intproporcionar uno.
- Grabe este libro, usa lo gotoque es (para todos menos para los hackers del kernel de Linux) malo, muy, muy , MUY malo.

Editar:
Oh, y

void main()

también es malo, es:

int main(int argc, char *argv[])
Morfildur
fuente
sí, está escrito en el libro que es mejor que uses goto bt por el bien de la integridad del libro, solo te estoy dando un ejemplo ... ¡así que el libro no es tan malo!
Kraken
5
gotoocasionalmente es lo correcto (y el kernel de Linux proporciona muchos ejemplos de eso, pero no es el único código que puede usarlo). Pero el ejemplo de OP claramente no es uno de esos casos, así que sí, ese libro debería quemarse :).
Adam Rosenfield
11

Prueba la salida del hombre .


Oh y:

#include <stdlib.h>

int main(void) {
  /*  ...  */
  if (error_occured) {
    return (EXIT_FAILURE);
  }
  /*  ...  */
  return (EXIT_SUCCESS);
}
Bertrand Marron
fuente
Más específicamente, intente "man 2 exit" desde una consola. Los documentos de c son bastante detallados.
Justin
Tienes razón @Bertrand Marron
Justin
7

La exit()función es un tipo de función con un tipo de retorno sin un argumento. Está definido por el archivo de encabezado stdlib.

Necesita usar ( exit(0) or exit(EXIT_SUCCESS))o (exit(non-zero)o exit(EXIT_FAILURE) ).

Nataraj Raja
fuente
4

El siguiente ejemplo muestra el uso de la exit()función.

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

Salida

Inicio del programa ....
Saliendo del programa ....

Martin max
fuente
2

Debe agregar una línea con #include <stdlib.h>para incluir ese archivo de encabezado y exitdebe devolver un valor, así que asigne algún número entero en exit(any_integer).

usuario4508201
fuente
2

Además de devolver un código de salida al proceso principal:

En UNIX, un aspecto importante que creo que se ha dejado de lado es que exit () en la primera llamada (en orden inverso) todas esas funciones, que fueron registradas por atexit () call.

Consulte SUSv4 para obtener más detalles.

causa última
fuente
1

en unix como la salida de los sistemas operativos pertenece al grupo de llamadas al sistema. Las llamadas al sistema son llamadas especiales que permiten al código de usuario (su código) llamar al código del kernel. por lo que la llamada de salida realiza algunas acciones de limpieza específicas del sistema operativo antes de devolver el control al sistema operativo, finaliza el programa.

#include <stdlib.h>

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

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

Algunos compiladores le darán el mismo código de operación de ambos ejemplos, pero otros no. Por ejemplo, el código de operación de la primera función no incluirá ningún tipo de código de operación de posicionamiento de pila que se incluirá en el segundo ejemplo como para cualquier otra función. Puede compilar ambos ejemplos y desmontarlos y verá la diferencia.

Puede usar la salida de cualquier parte de su código y asegurarse de que el proceso finalice. No olvide incluir el parámetro de número entero.

filvarga
fuente
-2

Escriba el archivo de encabezado #include<process.h>y reemplácelo exit();con exit(0);. Esto definitivamente funcionará en Turbo C; para otros compiladores, no lo sé.

Azeem Alvi
fuente
1
<process.h> `no es estándar. La exitfunción está declarada en <stdlib.h>.
Keith Thompson
<process.h> no resolverá este problema. ¿Ha entendido la pregunta que se hace?
CuriousMind
-3

Mala práctica de programación. Usar una función goto es un completo no no en la programación en C.
También incluya el archivo de encabezado stdlib.h escribiendo #include <iostream.h>para usar la exit()función. También recuerde que la función exit () toma un argumento entero. Úselo exit(0)si el programa se completó correctamente exit(-1)o salir de la función con un valor distinto de cero como argumento si el programa tiene un error.

Gaurav
fuente
1
<iostream.h>es específico de C ++ y no está relacionado con <stdlib.h>el encabezado que realmente se necesita. Los argumentos solamente portátil a la exitfunción son 0, EXIT_SUCCESSy EXIT_FAILURE. El uso de cualquier valor distinto de cero para denotar fallas es específico de los sistemas tipo UNIX (y probablemente algunos otros); no confíe en él en código portátil.
Keith Thompson
-4

Incluya stdlib.hen su encabezado y luego llame abort();en cualquier lugar donde desee salir de su programa. Me gusta esto:

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

Cuando el usuario ingresa al interruptor acepta esto y lo da al caso 3 donde llama a la abortfunción. Saldrá de su pantalla inmediatamente después de presionar la tecla Intro.

Muhammad Ahmad
fuente
6
abortno es lo apropiado para llamar aquí, no llamará a los atexitcontroladores ni vaciará los búferes de archivos abiertos. Solo debe usarse para la terminación anormal del programa, por ejemplo, afirmaciones fallidas, etc. Para la terminación normal del programa, exitdebe usarse.
Adam Rosenfield
-6

Utilice process.h en lugar de stdlib e iostream ... Funcionará al 100%.

Detalles
fuente
4
No sé qué es process.h; ciertamente no es C estándar y no funcionará en sistemas que no lo proporcionen. El <iostream>encabezado es específico de C ++; la pregunta es sobre C.
Keith Thompson
1
¡Esto no es Yahoo! Respuestas, es Stack Overflow. Si responde, ¡primero debe haberlo probado al menos!
wizzwizz4