2009-12-29 2 views
4

linux gcc 4.4.1 C99en utilisant exit (1) pour revenir d'une fonction

Je me demande simplement s'il existe un quelconque avantage à utiliser les techniques suivantes. J'ai remarqué avec un peu de code que je lisais le numéro de sortie a augmenté en valeur, tel qu'affiché dans cet extrait de code.

/* This would happen in 1 function */ 
if(test condition 1) 
{ 
    /* something went wrong */ 
    exit(1); 
} 

if(test condition 2) 
{ 
    /* something went wrong with another condition*/ 
    exit(2); 
} 

ou de faire ce qui suit et juste retour:

/* This would happen in 1 function */ 
if(test condition 1) 
{ 
    /* something went wrong */ 
    return; 
} 

if(test condition 2) 
{ 
    /* something went wrong with another condition*/ 
    return; 
} 

Répondre

23

exit() quitte l'intégralité de votre programme et rapporte l'argument que vous lui transmettez. Cela permet à tous les programmes qui exécutent votre programme de comprendre pourquoi il s'est terminé de manière incorrecte. (1 pourrait signifier l'échec de se connecter à une base de données, 2 pourrait signifier des arguments inattendus, etc.).

Le retour ne renvoie que la fonction en cours dans laquelle vous vous trouvez et non le programme entier.

4

exit ne reviendra pas d'une fonction. Il sortira du programme entier

3

Je ne pense pas que vous voulez quitter le programme entier, non?

Donc, juste revenant de la fonction serait bien.

/* This would happen in 1 function */ 
if(test condition 1) 
{ 
    /* something went wrong */ 
    return; /*return type must be void in this case */ 
} 

if(test condition 2) 
{ 
    /* something went wrong with another condition*/ 
    return; /*return type must be void in this case */ 
    } 

Vous pouvez également spécifier explicitement le type de retour de la fonction et utiliser la valeur de retour pour juger si tout allait bien ou non.

6

return retournera fondamentalement de la fonction et ajustera les pointeurs de pile de façon appropriée pour exécuter les instructions suivantes, où exit entraînera l'arrêt du programme lui-même.

en utilisant exit() dans une fonction indique l'erreur fatale et le programme ne peut pas récupérer et continuer et par conséquent, il doit être terminé.

2

Vous nous demandez si vous devriez retourner les codes d'erreur de vos fonctions?

Eh bien cela dépend de comment vous voulez être informatif pour vos utilisateurs. Si vous voulez agir comme un logiciel agit généralement et affiche une boîte de dialogue modale qui dit

Quelque chose de mal est arrivé!

Ensuite, il n'y a pas besoin de codes retour. Cependant, si vous voulez que votre logiciel soit utile à vos utilisateurs et qu'ils sachent ce qui s'est passé, vous devez fournir des informations de diagnostic (codes d'erreur au moins). Ensuite, vous pouvez faire apparaître un message qui dit:

Je ne peux pas ouvrir "foo.bar".

Ce fichier existe-t-il? Avez-vous un accès en lecture? Est-ce sur un partage réseau? Peut-être que je devrais essayer à nouveau?

2

Habituellement, cela permet au programme exécutant votre programme de prendre des décisions intelligentes. Par exemple, s'il y a un script wrapper autour de votre programme foo, il pourrait alors vérifier l'argument de sortie en utilisant la variable $$ et modifier le chemin d'exécution:

exec foo si $$ eq '0': echo " Succès " elif $$ eq '2': exec erreur-récupération-script

Vous pouvez également exécuter echo $$ pour voir quel était le code de sortie du programme.

+0

Je pense que vous voulez dire $ !. $$ est le pid du shell actuel, alors que $! est le statut de retour de la dernière commande. –

+0

Les deux d'entre nous se trompent :) Son $? Mais vous avez raison $$ est le pid du shell actuel – Methos

0

Si l'idée est de renvoyer la valeur en fonction de la condition de test, préférez utiliser return au lieu de exit.

Pour revenir 1, au lieu de la sortie (1), utilisez retour 1.

affichant pas les raisons, car il y avait une discussion détaillée pour la même dans ce link.

Questions connexes