Maison > développement back-end > C++ > le corps du texte

Pourquoi les noms de fonctions et les pointeurs de fonctions sont-ils équivalents en C ?

Barbara Streisand
Libérer: 2024-11-12 21:09:01
original
603 Les gens l'ont consulté

Why are Function Names and Function Pointers Equivalent in C  ?

Équivalence des noms de fonctions avec les pointeurs de fonctions

Les noms de fonctions en C servent à la fois de désignateurs de fonctions et de pointeurs de fonctions, fournissant un raccourci pratique pour référencer les fonctions . Cette équivalence a été débattue et sa justification réside dans des considérations historiques et le désir de simplifier l'utilisation des pointeurs de fonction.

Le document de justification C90 explique que les désignateurs de fonction peuvent être utilisés sous plusieurs formes, y compris en tant qu'appels de fonction (tous deux avec et sans l'opérateur astérisque) et comme pointeurs de fonction. Cette flexibilité permet diverses constructions syntaxiques, dont certaines peuvent sembler inhabituelles.

Par exemple, considérons les déclarations suivantes :

int f();
int (*pf)();
Copier après la connexion

Ici, le nom de la fonction f peut être appelé f( ), *f(), ou même ***f(). De plus, le pointeur de fonction pf peut être appelé de manière similaire, comme pf(), *pf() ou **pf().

La justification de cette équivalence découle du désir de simplifier l'utilisation de pointeurs de fonction. Dans de nombreux cas, il est plus pratique d'utiliser le nom de fonction directement comme pointeur de fonction plutôt que d'avoir à appliquer manuellement l'opérateur d'adresse de (&). Le langage permet donc l'équivalence des noms de fonctions et des pointeurs de fonctions.

Cependant, cette équivalence est limitée à certains contextes. Lors du renvoi d’un type de fonction, le type de fonction lui-même ne peut pas être implicitement converti en pointeur vers lui-même. Ceci est illustré dans l'exemple ci-dessous :

typedef bool FunctionType(int);
FunctionType h(); // Error!
Copier après la connexion

Dans ce cas, h() est déclarée comme une fonction qui renvoie un type de fonction, mais cela ne peut pas être implicitement converti en un pointeur vers ce type de fonction. Cependant, lorsqu'il est utilisé comme paramètre, le type de fonction peut être implicitement converti en pointeur vers lui-même.

FunctionType g(FunctionType); // Implicitly converted to void g(FunctionType *)
Copier après la connexion

Cette conversion implicite simplifie le passage des pointeurs de fonction en tant que paramètres. Dans l'ensemble, l'équivalence des noms de fonction et des pointeurs de fonction est un choix de conception qui équilibre la commodité avec les restrictions contextuelles, ce qui en fait une fonctionnalité pratique dans la programmation C.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal