J'ai récemment dû taper un petit programme de test C et, dans le processus, j'ai commis une faute d'orthographe dans la fonction principale en utilisant accidentellement vooid
au lieu de void
.
Et pourtant, cela fonctionnait toujours.
En le réduisant à sa plus petite version complète, je me suis retrouvé avec:
int main (vooid) {
return 42;
}
Cela compile effectivement ( gcc -Wall -o myprog myprog.c
) et, lorsqu'il est exécuté, il renvoie 42.
Comment est exactement ce code valide?
Voici une transcription coupée et collée de mon bash
shell pour montrer ce que je fais:
pax$ cat qq.c
int main (vooid) {
return 42;
}
pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq
pax$ echo $?
42
main
parmi les deux standard canoniques. Pour la portabilité, vous devriez utiliser l'un de ces deux mais je ne pense pas que UB s'applique ici.
main
doit avoir l'une des 2 formes canoniques (2.1.2.2). Mais vous avez raison @pax, dans un environnement autonome, l'identifiant main
n'est en aucun cas spécial: s'il est utilisé comme une fonction, il peut être de n'importe quel type et avoir n'importe quel nombre de paramètres de n'importe quel type.
int main (int argc, char *argv[], char *envp[]);
d'être conforme ).
int
paramètre, vous appelez le comportement indéfini . Tout peut arriver :)