Exit () fa qualcosa di speciale che "return" non fa?
Con alcuni compilatori per piattaforme non comuni, exit()
potrebbe tradurre il suo argomento nel valore di uscita del programma durante un ritorno damain()
potrebbe semplicemente passare il valore direttamente all'ambiente host senza alcuna traduzione.
Lo standard richiede un comportamento identico in questi casi (in particolare, dice che restituire qualcosa che è int
compatibile main()
dovrebbe essere equivalente a chiamare exit()
con quel valore). Il problema è che diversi sistemi operativi hanno convenzioni diverse per l'interpretazione dei valori di uscita. Su molti sistemi (MOLTI!), 0 significa successo e qualsiasi altra cosa è un fallimento. Ma su, diciamo, VMS, i valori dispari significano successo e anche quelli significano fallimento. Se restituissi 0 da main()
, un utente VMS vedrebbe un brutto messaggio su una violazione di accesso. In realtà non c'era una violazione di accesso - quello era semplicemente il messaggio standard associato al codice di errore 0.
Quindi l'ANSI è arrivato e benedetto EXIT_SUCCESS
e EXIT_FAILURE
come argomenti a cui potresti passare exit()
. Lo standard dice anche che exit(0)
bisogna comportarsi in modo identico a exit(EXIT_SUCCESS)
, quindi la maggior parte delle implementazioni definiscono EXIT_SUCCESS
a 0
.
Lo standard, quindi, ti mette in relazione con VMS, in quanto non lascia alcun modo standard per restituire un codice di errore che ha il valore 0.
Il compilatore VAX / VMS C dell'inizio degli anni '90 non interpretava quindi il valore di ritorno main()
, ma semplicemente restituiva qualsiasi valore all'ambiente host. Ma se lo utilizzassi exit()
, farebbe ciò che lo standard richiesto: tradurre EXIT_SUCCESS
(o 0
) in un codice di successo e EXIT_FAILURE
in un codice di errore generico. Per utilizzarlo EXIT_SUCCESS
, è stato necessario passarlo a exit()
, da cui non è stato possibile restituirlo main()
. Non so se versioni più moderne di quel compilatore conservassero quel comportamento.
Un programma C portatile usato per assomigliare a questo:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello, World!\n");
exit(EXIT_SUCCESS); /* to get good return value to OS */
/*NOTREACHED*/ /* to silence lint warning */
return 0; /* to silence compiler warning */
}
A parte: se ricordo bene, la convenzione VMS per i valori di uscita è più sfumata di pari / dispari. In realtà usa qualcosa come i tre bit bassi per codificare un livello di gravità. In generale, tuttavia, i livelli di gravità dispari indicavano il successo o informazioni varie e quelli pari indicavano errori.