Valeur renvoyee par main
Le
Greydavayar
Bonsoir,
j'ai appris le C avec la notion suivante : la fonction main doit
TOUJOURS retourner 0 sinon, c'est qu'une erreur s'est produite.
Or, je n'ai vu aucun passage dans la norme qui impose que la valeur
retournee soit 0.
Et recemment, j'ai discute avec un eleve d'EPITECH qui lui retournait
systematiquement 1..
Nous avons tous les deux appris avec des methodes differentes, chacune
d'entre elles affirme qu'il FAUT retourner une valeur en particulier
et impose cette valeur.. Pourquoi?
Je suppose que la gestion d'erreurs n'est pas la meme selon les OS et
que ca joue donc sur la valeur de retour, mais existe t'il une loi
"universelle", existe t'il une "bonne pratique", pourquoi les cours
imposent-ils une valeur en particulier??
Merci d'avance
j'ai appris le C avec la notion suivante : la fonction main doit
TOUJOURS retourner 0 sinon, c'est qu'une erreur s'est produite.
Or, je n'ai vu aucun passage dans la norme qui impose que la valeur
retournee soit 0.
Et recemment, j'ai discute avec un eleve d'EPITECH qui lui retournait
systematiquement 1..
Nous avons tous les deux appris avec des methodes differentes, chacune
d'entre elles affirme qu'il FAUT retourner une valeur en particulier
et impose cette valeur.. Pourquoi?
Je suppose que la gestion d'erreurs n'est pas la meme selon les OS et
que ca joue donc sur la valeur de retour, mais existe t'il une loi
"universelle", existe t'il une "bonne pratique", pourquoi les cours
imposent-ils une valeur en particulier??
Merci d'avance

Poser une question


Ce n'est pas imposé, c'est une convention, comme d'habitude tu peux en
choisir une autre.
Cela étant, c'est clairement dit dans la norme, quoique ce ne soit pas
direct :
- cela ne s'applique que pour les applications « hébergées »
- la valeur retournée par main est passé à exit
- exit(0) dénote le succès, à charge à l'environnement (le compilateur)
de magouiller si nécessaire pour l'information transmise soit «succès»!
Une autre convention, dont j'ajouterai qu'elle est moins répandue.
Pourquoi quoi ? Pourquoi tous les deux, pourquoi appris, pourquoi
différentes (la réponse est ci-dessus), pourquoi il faut, pourquoi 0 (la
raison c'est le shell de Unix qui considère que 0 = OK), pourquoi 1
(bonne question)
Antoine
Cet eleve a tort. Il a du reussir a passer a travers les quelques cours qu'ils
ont... en particulier, ils apprennent quand meme entre autres a coder sur Unix,
et il *faut* retourner 0 pour que ca ait un sens pour le shell. 1 signifie
que le programme s'est termine en erreur.
Il a du se melanger les pinceaux entre les booleens et les codes de retour.
Non, non. La valeur "tout va bien" universelle est bien 0 (des que tu es
dans un hosted environment. En freestanding, de toutes facons, main n'a pas
forcement un sens, et c'est la documentation de ton environnement qui explique
ce qu'il faut faire, la norme te dit juste que ce genre de truc devra etre
documente).
confere 5.1.2.2.3, et 7.20.4.3. Il y est ecrit de facon explicite que le return
en fin de main est equivalent a l'appel de exit, qu'en C99, un main sans return
renvoie 0, et que exit(0) est une des facons (pas forcement la seule) de
faire "succesful termination".
(l'autre facon etant d'include stdlib.h et d'utiliser EXIT_SUCCESS, qui peut
valoir 0 ou une autre valeur equivalente pour l'OS).
Par contre, la seule facon totalement portable de dire "mon programme a echoue",
c'est de renvoyer EXIT_FAILURE.
Le detail des codes de retour est dependant de l'implementation. Tu devras
te referer a une autre norme (par exemple POSIX) pour pouvoir etre plus
precis (et posix te dit que tu as 256 valeurs distinctes, entre 0 et 255, et
qu'apres il se passe... autre chose. En particulier, faire un truc tel que:
...
if (probleme)
erreur++;
...
exit(erreur);
est un bug: ton programme va faire semblant de marcher toutes les 256 erreurs)
Je te remercie j'y vois plus clair, qu'entends tu par "applications «
hébergées »"?
Ce que j'appelle "hosted" dans ma reponse (je ne connais pas de traduction
satisfaisante), par opposition a freestanding (embarque, la c'est plus simple).
La norme du C couvre a peu pres tout (sauf VMS C, apparemment), y compris ta
montre. En general, sur une montre, des concepts tels que le demarrage du
programme, ou stdin/stdout, ou malloc, n'ont que peu de sens. La norme se
decoupe ainsi en "le langage a proprement parler" et "l'environnement classique
d'execution". Si ton environnement est "heberge"/hosted, ca veut dire que tu
tournes sur quelque chose qui ressemble assez a un ordinateur classique pour
avoir entrees/sorties, demarrage de programme, allocation memoire... et tout
ceci est alors defini. Sinon, ben tu es dans le domaine de l'embarque, et la
norme te dit juste que la documentation de ton environnement DOIT expliquer
comment tous ces aspects marchent.
(note au passage: un systeme conforme a la norme correspond generalement a
une machine, un compilateur, et un jeu d'options. Par exemple, tu peux
tres bien avoir un compilo sous Windows qui se proclame ANSI, a partir du
moment ou la documentation te dit quelles options utiliser pour etre en C
ANSI, en particulier recuperer un main() de type "ligne de commande" et des
entrees-sortie stdin/stdout qui fonctionnent)
D'accord merci c'est limpide a present