Il s'agit d'une histoire sans fin qui reflète les limites (un mythe) de "l'interopérabilité et la portabilité par-dessus tout".
Ce que le programme doit renvoyer pour indiquer un "succès" doit être défini par celui qui reçoit la valeur (le système d'exploitation ou le processus qui a invoqué le programme) et non par une spécification du langage.
Mais les programmeurs aiment écrire du code d'une "manière portable" et donc ils inventent leur propre modèle pour le concept de "système d'exploitation" définissant des valeurs symboliques à retourner.
Maintenant, dans un scénario many-to-many (où de nombreux langages servent à écrire des programmes pour de nombreux systèmes), la correspondance entre la convention du langage pour le "succès" et celle du système d'exploitation (que personne ne peut garantir être toujours la même) devrait être gérée par l'implémentation spécifique d'une bibliothèque pour une plate-forme cible spécifique.
Mais - malheureusement - ces concepts n'étaient pas aussi clairs à l'époque où le langage C a été déployé (principalement pour écrire le noyau UNIX), et des gigagrammes de livres ont été écrits en disant "retour 0 signifie succès", puisque c'était vrai sur le système d'exploitation de l'époque ayant un compilateur C.
Dès lors, aucune normalisation claire n'a jamais été faite sur la manière dont une telle correspondance devait être traitée. Le C et le C++ ont leur propre définition des "valeurs de retour" mais personne n'a fourni une traduction correcte pour les systèmes d'exploitation (ou mieux : aucune documentation de compilateur n'en parle). 0 signifie le succès si c'est vrai pour UNIX - LINUX et - pour des raisons indépendantes - pour Windows aussi, et cela couvre 90% des "ordinateurs grand public" existants, qui - dans la plupart des cas - ne tiennent pas compte de la valeur de retour (ainsi nous pouvons discuter pendant des décennies, mais personne ne le remarquera jamais !)
Dans ce scénario, avant de prendre une décision, posez-vous ces questions : - Suis-je intéressé à communiquer quelque chose à mon interlocuteur sur mon existant ? (Si je renvoie toujours 0 ... il n'y a pas d'indice derrière tout cela). - Mon interlocuteur a-t-il des conventions concernant cette communication ? (Notez qu'une valeur unique n'est pas une convention : cela ne permet aucune représentation de l'information).
Si les deux réponses sont négatives, la bonne solution est probablement de ne pas écrire du tout l'instruction de retour principale. (Et laisser le compilateur décider, en fonction de la cible sur laquelle il travaille).
Si aucune convention n'est en place 0=réussite répondent à la plupart des situations (et l'utilisation de symboles peut être problématique, s'ils introduisent une convention).
Si des conventions sont en place, assurez-vous d'utiliser des constantes symboliques qui sont cohérentes avec elles (et assurez la cohérence des conventions, et non la cohérence des valeurs, entre les plateformes).
0 votes
Cela répond-il à votre question ? stackoverflow.com/questions/1188335/
2 votes
Cette réponse à propos du C90 paraphrase la norme --
0
yEXIT_SUCCESS
sont toutes deux interprétées comme des succès.1 votes
Je vais répondre ici car je pense que quelqu'un d'autre lira ce document à l'avenir. Fondamentalement, il existe de nombreux paradigmes sur ce à quoi ressemble un "C correct". Certains paradigmes préfèrent utiliser des littéraux plutôt que des macros, par exemple, au lieu de passer NULL comme argument, ils peuvent passer (const char *)0 pour indiquer que ce n'est pas seulement un null, mais que si ce n'était pas null, ce devrait être un pointeur de caractère constant. D'autres paradigmes préfèrent être agnostiques quant aux types et, en utilisant des macrotypes, ils peuvent éviter de devoir modifier leur base de code lorsque les choses changent radicalement. Par exemple, de nombreux -
1 votes
@Dmitry <continued> Les définitions de type de l'API Windows ne sont pas correctes sur les plateformes plus récentes, mais comme il s'agissait de macros, ils avaient un moyen facile de changer tous les types pour ceux qui fonctionnent en redéfinissant la macro, et beaucoup de ces types ont simplement été mis à l'échelle par définition(par exemple, int est différent sur les différentes plateformes). Pour résumer, utilisez des choses comme EXIT_SUCCESS si le code de retour a de l'importance et peut changer dans le futur, sinon le retour de 0 peut sembler être un nombre magique, mais c'est toujours une convention standard parfaitement valide. Le code d'erreur est principalement utilisé par les programmes pour transmettre les résultats des nombres d'un programme à l'autre.
1 votes
@Dmitry <continued> utiliser les codes d'erreur pour déboguer votre programme est un peu faible puisque si le programme retourne 0, c'est une information plutôt inutile sauf dans certains cas où il y a des erreurs non traitées dans un programme qui peuvent faire que le programme se casse silencieusement, et vous devez vérifier s'il est retourné normalement(0) ou si une erreur silencieuse s'est produite. Le retour numérique est plus utile pour faire passer 0..255 d'un programme à un autre en fonction de leurs entrées, sinon il n'y a aucune raison d'y penser : soit vous retournez 0, soit vous utilisez un main précompilé qui inline un appel void "init" pour ne pas vous ennuyer visuellement avec des retours inutiles.
1 votes
En effet, si les gens regardent votre code source principal et voient qu'il renvoie une macro, ils ne peuvent pas dire avec certitude que c'est 0 sans aller à la définition de EXIT_SUCCESS et la vérifier : facile dans certains éditeurs, difficile dans d'autres. Dire dans votre documentation qu'elle renvoie EXIT_SUCCESS est carrément inutile parce que les gens ne savent pas ce qu'est EXIT_SUCCESS à moins de faire des suppositions, et faire des suppositions sur les macros permet de se tromper sur le retour puisque les macros peuvent varier