11
votes

Quelle valeur de retour devriez-vous utiliser pour un appel de la fonction échoué en C?

Duplicaté possible:

Manipulation des erreurs en Code C

Disons que vous avez une fonction: xxx

Que doit-il être x et y?

parce que j'ai une autre fonction: < PRE> XXX

Je sais pour cet exemple particulier, l'utilisation d'une valeur de retour de 1 prendra le deuxième bloc de code pour "faire des trucs n ° 1" et utiliser une valeur de retour de 0 prendra le deuxième bloc de code à "Les trucs # 2"

Ma question est ce qui est le style préféré en C pour le faire? Une valeur de retour de 0 pour une fonction indique-t-elle le succès et toute autre valeur indique une défaillance? Ou vice versa? Ou des valeurs inférieures à 0?

J'aimerais m'assurer que j'écris mon code C avec le style actuel. Merci!

c

1 commentaires

Ce fil discus la même chose:


8 Réponses :



0
votes

1 = vrai 0 = faux

en général ....

Parfois, les gens utilisent -1 pour "erreur"

Une autre façon de gérer cela est avec Enums et parfois #defines. Bien que plusieurs fois, les gens n'utilisent pas cela à moins de nombreuses erreurs ... et généralement de multiples erreurs sont gérées par divers numéros négatifs.


0 commentaires

2
votes

Dans un contexte conditionnel, les entiers évaluent "true" si elles ne sont pas zéro et "false" si zéro, vous devez donc retourner 0 sur une panne si vous souhaitez utiliser la fonction dans De cette façon, et assurez-vous que pas de retourner 0 dans la branche réussie.


0 commentaires

4
votes

Les deux sont utilisés, et cela dépend généralement de si plusieurs codes d'erreur peuvent être retournés.

Si votre fonction ne «réussira» ou «échoue» ou «échoue» sans informations supplémentaires, je vous recommanderais de retourner 0 pour échec et 1 pour le succès, car c'est plus simple et plus sémantiquement valide.

Si votre fonction peut échouer avec plusieurs codes d'état, le seul moyen de passer est d'avoir 0 pour réussir et autres valeurs pour une défaillance représentant différents statuts.


0 commentaires

21
votes

pour le succès non-pointeur / échec:

  • 0 => Succès
  • -1 => échoue

    pour fonctions de pointeur:

    • null => échoue
    • Tout le reste => Succès

3 commentaires

Avez-vous utilisé -1 comme moyen de détecter des erreurs dans plusieurs appels de manière compacte? Par exemple. err + = func1 (); ERR + = FUNC2 (); if (ERR <0) printf ("erreur");


Donc, si le succès est de la valeur de retour 0, ces déclarations équivalentes: "si (my_function ())" et "if (my_function () == 0)"?


Non, le succès est marqué par 0 , des appels équivalents serait si (! My_function ()) et si (my_function () == 0) .



-3
votes

Utilisez #define.

#define TRUE 1
#define FALSE 0


0 commentaires

2
votes

Il n'y a pas de bonne réponse.

Si votre fonction est nommée / documentée comme évaluation d'un prédicat d'une sorte, il doit renvoyer une valeur non zéro (1 si pratique) pour "vrai" et 0 pour false.

Si votre fonction renvoie un pointeur, 0 (null pointeur) est à peu près le seul moyen raisonnable de signaler une défaillance. Conventions telles que le retour (void *) - 1 , map_failed , sem_failed , et telle est hideuse et ne doit pas être copiée. Si vous devez signaler une raison de défaillance, ajoutez un argument int * ossle et include si (code de code) * ERRORCODE = raison; à la fin de votre fonction pour permettre Les appelants qui ne se soucient pas de la raison de passer un pointeur NULL.

Si votre fonction renvoie une valeur numérique telle que seules certaines valeurs de plage ont un sens (par exemple, seuls des entiers non négatifs, ou uniquement des valeurs de point flottant finies), utilisez des valeurs hors de portée des codes d'erreur (par exemple, des entiers négatifs ou Nan / infini) comme codes d'erreur. Si vous n'avez pas assez de codes possibles (par exemple, NAN), utilisez l'approche int * / code> décrite ci-dessus.


0 commentaires

0
votes

À mon avis, les deux pourraient travailler, mais dans des cas différents.

  1. Si vous faites la fonction de faire une certaine opération, renvoyez 0 pour réussir, -1 pour échec, et définir errno à une valeur appropriée afin que l'appelant puisse le vérifier pour connaître le détail de l'échec. Parfois, les gens utilisent également différentes valeurs de retour pour signifier différentes échecs.

  2. Si vous souhaitez que la fonction teste une condition, vous devriez le rendre renvoyé soit true ou false et utilisez si (xxx () == true) plus tard. Plus tard. La forme de si (xxx ()) n'est pas recommandée, bien que beaucoup de gens le font pour économiser des horaires de clavier de frappe. true et false n'est pas un type de données intégré en C. Cependant, de nombreux environnements de programmation le définiront comme true = 1 et false = 0 , vous pouvez le faire vous-même si vous ne travaillez pas dans un tel environnement.


0 commentaires