En C, ce n'est pas une erreur de lancer un pointeur d'un type à un autre. Cependant, un bon compilateur générera un avertissement lors du passage du mauvais type de pointeur à une fonction sans un cast explicite. Si vous n'obtenez pas d'avertissement, je vous recommande vivement de vérifier les paramètres de votre compilateur pour vous assurer que les avertissements sont activés. Ou pensez à utiliser un compilateur différent. ;-)
Pour comprendre pourquoi cela fonctionne, vous devez comprendre un peu le langage d'assemblage et comment C utilise the stack pour transmettre des paramètres. Vous pouvez visualiser la pile comme une grande pile de plaques, où chaque plaque contient une variable simple. Sur de nombreuses plateformes, tous les paramètres sont transmis sur la pile. func
va appuyer sur y
et x
, appeler f
, puis retirer les variables. En valid
charge x
et y
en regardant les deux entrées supérieures de la pile. invalid
trouve x
en regardant l'entrée du haut de la pile.
Voici ce que la pile pourrait ressembler à l'intérieur invalide:
main: 3
uninitialized
f: 2
1
invalid
invalid: 2
1
invalid()
prend un paramètre, il semble juste en haut de la pile (le 1) et la charge comme paramètre.
C'est aussi le fonctionnement des fonctions printf
. Ils peuvent accepter un nombre variable de paramètres. Le premier paramètre est en haut de la pile, et ils peuvent continuer à regarder dans la pile pour tous les paramètres dont ils ont besoin. Certains systèmes passent des paramètres dans des registres au lieu d'utiliser la pile, mais cela fonctionne de manière analogue.
Dans les tout premiers jours de C, les déclarations de fonction n'incluaient aucun paramètre. En fait, si vous déclarez une fonction sans rien entre parenthèses, vous pouvez toujours définir une fonction de cette façon.Par exemple, cette compile très bien:
void foo();
void bar(void) {
foo(5); /* foo's parameters are implicit */
}
Voilà pourquoi il est important d'inclure la void
lors de la déclaration d'une fonction sans paramètres. Il indique au compilateur que la fonction prend vraiment aucun paramètre. Avec rien entre les parenthèses, c'est une fonction avec des paramètres implicites.
juste par curiosité ... le programme ci-dessus produit-il correctement? – SysAdmin
Oui, c'est le cas ... c'est pourquoi j'ai demandé en fait. –
compilez-vous avec des avertissements? –