Duplicaté possible: strong>
Manipulation des erreurs en Code C P>Disons que vous avez une fonction: p>
xxx pré> Que doit-il être x et y? p>
parce que j'ai une autre fonction: p> < PRE> XXX PRE>
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" p>
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? P>
J'aimerais m'assurer que j'écris mon code C avec le style actuel. Merci! P> BlockQuote>
8 Réponses :
Historiquement, une valeur de retour de 0 code> indique généralement le succès, tandis qu'une valeur de retour de -1 code> indique une défaillance. Vous pouvez également utiliser plus de valeurs de sortie pour donner à l'utilisateur des informations plus détaillées sur l'état de retour. Il s'agit d'une autre tradition de définir une variable de code d'erreur globale, voir E.G. GetLasterRor et SelasterRor sur Windows. P>
1 = vrai 0 = faux p>
en général .... p>
Parfois, les gens utilisent -1 pour "erreur" p>
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. P>
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 code> sur une panne si vous souhaitez utiliser la fonction dans De cette façon, et assurez-vous que pas em> de retourner 0 code> dans la branche réussie. P>
Les deux sont utilisés, et cela dépend généralement de si plusieurs codes d'erreur peuvent être retournés. P>
Si votre fonction ne «réussira» ou «échoue» ou «échoue» sans informations supplémentaires, je vous recommanderais de retourner Si votre fonction peut échouer avec plusieurs codes d'état, le seul moyen de passer est d'avoir 0 code> pour échec et 1 code> pour le succès, car c'est plus simple et plus sémantiquement valide. p>
0 code> pour réussir et autres valeurs pour une défaillance représentant différents statuts. P>
pour le succès non-pointeur / échec: P>
0 code> => Succès Li>
-
-1 code> => échoue li>
ul>
pour fonctions de pointeur: p>
-
null code> => échoue li>
- Tout le reste => Succès Li>
ul>
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"); code>
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 code>, des appels équivalents serait si (! My_function ()) code> et si (my_function () == 0) Code >.
Utilisez #define.
#define TRUE 1 #define FALSE 0
Il n'y a pas de bonne réponse. P>
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. P>
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 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 (void *) - 1 code>, map_failed code>, sem_failed code>, et telle est hideuse et ne doit pas être copiée. Si vous devez signaler une raison de défaillance, ajoutez un argument code> int * ossle code> et include si (code de code) * ERRORCODE = raison; code> à la fin de votre fonction pour permettre Les appelants qui ne se soucient pas de la raison de passer un pointeur NULL. P>
int * / code> décrite ci-dessus. P>
À mon avis, les deux pourraient travailler, mais dans des cas différents. P>
Si vous faites la fonction de faire une certaine opération, renvoyez 0 pour réussir, -1 pour échec,
et définir Si vous souhaitez que la fonction teste une condition, vous devriez le rendre renvoyé soit
errno code> à 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. P> li>
true code> ou false code> et utilisez si (xxx () == true) code> plus tard. Plus tard. La forme de si (xxx ()) code> n'est pas recommandée, bien que beaucoup de gens le font pour économiser des horaires de clavier de frappe.
true code> et false code> n'est pas un type de données intégré en C. Cependant, de nombreux environnements de programmation le définiront comme true = 1 code> et false = 0 code>, vous pouvez le faire vous-même si vous ne travaillez pas dans un tel environnement. P> LI>
ol>
Ce fil discus la même chose: