Pourquoi ne puis-je appeler une fonction par l'intermédiaire d'un pointeur avec trop d'arguments?
Dire que j'ai cette fonction:
int func2() {
printf("func2\n");
return 0;
}
Maintenant je déclare un pointeur:
int (*fp)(double);
Ce doit pointer vers une fonction qui prend un double
argument et renvoie un int
.
func2
n'a aucun argument, mais encore quand j'écris:
fp = func2;
fp(2);
(avec 2
être juste un nombre arbitraire), func2 " est invoquée correctement.
Pourquoi est-ce? N'est-il pas un sens à la nombre de paramètres, je déclare un pointeur de fonction?
- La réponse courte est "la déclaration d'une fonction sans arguments... et puis, délibérément, en passant un argument... est tout simplement faux".
Vous devez vous connecter pour publier un commentaire.
Oui, il y a un sens. En C (mais pas en C++), une fonction déclarée avec un ensemble vide de parenthèses signifie qu'il faut un non spécifié nombre de paramètres. Lorsque vous faites cela, vous êtes empêcher le compilateur de vérifier le nombre et les types d'arguments; c'est un vestige d'avant le langage C a été normalisé par l'ANSI et ISO.
À défaut d'appeler une fonction avec le bon nombre et les types d'arguments résultats dans comportement indéfini. Si vous au lieu de déclarer explicitement votre fonction, prendre à zéro des paramètres à l'aide d'une liste de paramètres de
void
, alors le compilateur vous donnera un avertissement lorsque vous affectez un pointeur de fonction de type incorrect:Vous devez déclarer explicitement le paramètre, sinon vous obtiendrez un comportement indéfini 🙂