vendredi 11 avril 2014

le retour du main

Pourquoi le programme suivant compile t-il ?

int main(int argc,char *argv[]) {}

Pas de return mais le compilateur ne dit rien! Il faut juste noter au passage, que selon les compilateurs, versions, etc des messages peuvent être générés.
La raison est simple mais cachée dans les détails du standard C99.


5.1.2.2.3 Program termination
If the return type of the main function is a type compatible with int, a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument;10) reaching the } that terminates the main function returns a value of 0. If the return type is not compatible with int, the termination status returned to the host environment is unspecified. 

Autrement dit, vous pouvez omettre l'expression return car de toutes les façons, le compilateur génèrera un return 0 sur le flot qui conduira à l'accolade fermante.
Personnellement je trouve que c'est particulièrement moche. Mais sur un appel récursif, cela fonctionne t-il aussi ?

DjiBee

2 commentaires:

  1. Mais le type de la valeur de retour du main? Comment ça ce fait qu'on puisse écrire le suivant :

    typedef struct e {
    int x;
    } test;

    test main(int argc,char **argv) {}

    et que ça compile?

    RépondreSupprimer
  2. Ça compile avec un warning, très probablement. Si main() ne renvoie pas int, le comportement du programme est indéfini et le compilateur est libre de choisir la sémantique qu'il souhaite.

    RépondreSupprimer