• [^] # Re: On va encore dire que je suis un raleur mais...

    Posté par . En réponse au journal Des nouvelles de Gnome. Évalué à 4.

    Suite au moinssage en force de mon poste précédent je me permet d'argumenter un peu.
    Tout d'abord commençons par un petit résumé des épisodes précédents :
    Jusqu'à ce que Borland décide de créer un compilateur C tous les compilateurs du monde sortait une erreur ou au moins un warning grave quand on avait le malheur d'oublier de mettre le type de retour de la fonction main.
    Les compilateurs UNIX créés à des époques ou la mémoire valait une telle fortune que toutes les instructions de base étaient codées sur deux caractères (ls, vi, ed, df etc.) refusaient tout bonnement de compiler votre code si vous déclariez "main" de la façon suivante :
    void main(void) ou void main(int argc, char **argv)

    Les raisons sont multiples. On peut en trouver un certain nombre par ici : http://users.aber.ac.uk/auj/voidmain.shtml(...)
    http://www.delorie.com/djgpp/v2faq/faq22_25.html(...)

    Les principales raisons sont :
    - Parceque c'est pas standard en C
    - Parcequ'un script ou un autre programme n'a aucun moyen de savoir si le programme s'est bien terminé.
    - Parceque le système aime bien qu'on lui renvoit un message quand on s'arrète de fonctionner parceque sinon il ne peut pas savoir si c'est le controlleur de processus qui ne se met pas à jour ou si c'est le processus qui ne répond plus.
    - En C++ ISO le void main est tout simplement rejeté par le compilo.

    Depuis Borland a créé un compilateur C pour dos (le fameux bc1.0). Et sous DOS il y a pas de langage de script à proprement parler, il y a un seul programme et un seul utilisateur à un instant donné et si le programme crashe il y a 99.9% de schance pour qu'il entrainne DOS avec lui.
    Dans cette optique Borland c'est dit que void main c'était valable. Et des générations de développeur squi ont découvert la programmation sur le Dos de papa ont utilisé la syntaxe void main. Et certains ont même écrit des livres, en utilisant le void main dans tous les sens.

    Seulement voilà, les OS monocouche/monoutilisateur/monoapplication on (heureusement) disparus et les autres ont besoin d'un retour de la fonction main. Windows y compris, en fait avec le nombre de callback et les possibilités d'interactions COM+ windows a absolument besoin d'un retour.
    Alors pourquoi déclarer la syntaxe void main comme valide avec tous els dangers que celà représente pour le système ? La réponse est là : http://www.awprofessional.com/articles/article.asp?p=25322&seqN(...)
    Tout à la fin de l'article vous verrez :
    A void return type, paradoxically, internally results in a return status of 0; that is, the execution environment always interprets the program as having succeeded.
    Et oui, si vous déclarer void main le compilo transformera celà en int main et renverra toujours 0 (success). Donc :
    - Si votre programme crash le système n'en sera jamais informé, toute les protections qui évitent qu'un programme qui crashe soit relancé en boucle indéfiniment deviennent inutiles
    - La signature de votre fonction main() est fausse
    - Les appels a des objets COM/COM+ ou autres bibliothèques depuis votre programme deviennent indébuggables (difficile de remonter une erreur jusqu'à sa source quand aucune erreur n'est levée) etc.

    On peut trouver des excuses totu à fait valable aux gotos aux indirections multiples et enchevétrées, à la reccursivité non terminale cassée à coup de Break et à d'autres sagouineries qui peuvent s'avérer necessaires dans des cas très particuliers. Mais il n'y a aucune excuse pour utiliser void comme type de retour de main. Même dans les langages ou l'utilité d'un int en type de retour est plus discutable (java par exemple) on ne perd pas grand chose à le faire quand même.