Comment faire passer une fonction en paramètre dans C?
Je veux créer une fonction qui effectue une fonction passée en paramètre sur un ensemble de données. Comment faire passer une fonction en paramètre dans C?
- Si vous êtes à l'aide de fonctions/tableaux de variables, utilisez TOUJOURS
typedef
. - Nous l'appelons pointeur de Fonction
- Le nom de la fonction doit être un ponter à la fonction. La plupart des gens, l'apprentissage de la couverture de C qsort, tôt ou tard, ce qui est exactement ce que ?
- Je ne suis pas d'accord avec votre suggestion, et votre suggestion manque de raisonnement à l'appui de la conclusion. Personnellement, je préfère ne jamais utiliser typedef sur des pointeurs de fonction, et je pense que ça rend le code plus clair et plus facile à lire.
- Vous préférez
void funcA(void(*funcB)(int))
etvoid (*funcA())()
àtypedef void funcB(); void funcA(funcB)
etfuncB funcA()
? Je ne vois pas l'avantage. - Oh, j'ai juste remarqué le commentaire dit "des tableaux en tant que variables". Oui, c'est misworded. Je voulais tableau de pointeurs comme des variables.
Vous devez vous connecter pour publier un commentaire.
Déclaration
Un prototype d'une fonction qui prend un paramètre de fonction se présente comme suit:
Cela indique que le paramètre
f
sera un pointeur vers une fonction qui a unvoid
type de retour et qui prend un seulint
paramètre. La fonction suivante (print
) est un exemple d'une fonction qui pourrait être transmis àfunc
comme un paramètre parce que c'est le bon type:Appel De Fonction
Lors de l'appel d'une fonction avec un paramètre de la fonction, la valeur transmise doit être un pointeur sur une fonction. Utiliser le nom de la fonction (sans parenthèses) pour cela:
appellerais
func
, en passant à la fonction d'impression à elle.Corps De La Fonction
Comme avec n'importe quel paramètre, func pouvez maintenant utiliser le nom du paramètre dans le corps de la fonction pour accéder à la valeur du paramètre. Disons que func appliquera la fonction, il est transmis à l'un des numéros de 0 à 4. Considérons, en premier, ce que la boucle serait ressembler à l'appel d'imprimer directement:
Depuis
func
's paramètre déclaration dit quef
est le nom d'un pointeur vers la fonction de votre choix, nous rappelons d'abord que sif
est un pointeur puis*f
est la chose quif
points (par exemple, la fonctionprint
dans ce cas). Comme un résultat, il suffit de remplacer chaque occurrence de l'imprimé dans la boucle ci-dessus avec*f
:De http://math.hws.edu/bridgeman/courses/331/f05/handouts/c-c++-notes.html
f
appel de fonction peut prendref
tout comme l'est sans *. Il pourrait être une bonne idée de le faire comme vous le faites cependant, pour qu'il soit clair que le paramètre f est un pointeur de fonction. Mais ça fait mal la lisibilité assez souvent.typedef
pour les pointeurs de fonction? Désolé, avoir à voter.*
lors de la déclaration d'un pointeur de fonction, correct? Parce que vous ne pouvez pas définir une fonction à partir d'une fonction de définition de type. Il y a beaucoup d'informations sur la définition de type-ing pointeurs de fonction, mais pas des types de fonction.Cette question a déjà la réponse pour la définition des pointeurs de fonction, cependant ils peuvent être assez complexes, surtout si vous allez les passer autour de votre application. Pour éviter ce désagrément, je vous recommande d'typedef le pointeur de fonction dans quelque chose de plus lisible. Par exemple.
Déclare une fonction de type void et ne prend pas d'arguments. Pour créer un pointeur de fonction de ce type, vous pouvez maintenant faire:
Pour une fonction qui renvoie un int et qui prend un char que vous feriez
et de l'utiliser
Il y a des bibliothèques qui peuvent aider à transformer des pointeurs de fonction dans agréable lisible types. Le fonction boost bibliothèque est excellent et vaut bien l'effort!
est tellement plus agréable que le précédent.
typedef
; il est plus simple et ne nécessite pas de bibliothèques supplémentaires.Depuis C++11, vous pouvez utiliser le fonctionnelle de la bibliothèque pour ce faire, dans un bref et générique de la mode. La syntaxe est, par exemple,
où
bool
est le type de retour ici d'un argument une fonction dont le premier argument est de typeint
.J'ai inclus un exemple de programme ci-dessous:
Parfois, cependant, il est plus pratique d'utiliser un modèle de fonction:
Passer adresse d'une fonction comme paramètre à une autre fonction comme indiqué ci-dessous
Aussi, nous pouvons passer de la fonction en tant que paramètre à l'aide de pointeur de fonction
Vous avez besoin pour passer un pointeur de fonction. La syntaxe est un peu encombrant, mais c'est vraiment puissant une fois que vous vous familiariser avec elle.
Fonctions peuvent être "passé" comme des pointeurs de fonction, comme par 6.7.6.3p8: "de la déclaration d'Un paramètre ‘fonction de retour de type’ doit être réglé sur ‘pointeur de fonction de retour de type’, comme dans 6.3.2.1. ". Par exemple, ceci:
est équivalent à ceci:
Ce n'est pas vraiment une fonction, mais c'est un localisée morceau de code. Bien sûr, il ne passe pas le code juste le résultat. Il ne fonctionnera pas si elle est transmise à un événement dispatcher pour être exécuté plus tard (car le résultat est calculé à maintenant, et non pas lorsque l'événement se produit). Mais il n'localiser votre code dans un endroit si c'est tout ce que vous essayez de faire.