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
int
paramètre, vous appelez le comportement indéfini . Tout peut arriver :)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'identifiantmain
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 ).Réponses:
Il utilise simplement la syntaxe de déclaration de fonction «à l'ancienne»; vous déclarez implicitement un
int
paramètre appelévooid
.la source
-std=c99
, je reçoisqq.c:1: warning: type of 'vooid' defaults to 'int'
.C'est un code valide, car myprog.c contient:
vooid
contient un plus le nombre d'arguments passés (c'est-à-direargc
). Donc, tout ce que vous avez fait en effet est de renommerargc
àvooid
.la source
En C, le type par défaut d'un argument de fonction est
int
. Donc, votre programme traite le motvooid
commeint main(int vooid)
un code parfaitement valide.la source
C'est seulement
gcc -std=c89 -Wall -o qq qq.c
etgcc -std=gnu89 -Wall -o qq qq.c
n'émet pas d'avertissement. Toutes les autres normes émettent un avertissement sur le type impliciteint
pourvooid
.int main(chart)
se comporte de la même manière queint main (vooid)
.return vooid;
renvoie le nombre d'arguments de ligne de commande.J'ai testé avec gcc 4.4.5 sur le système de test Debian.
la source