Maison  >  Article  >  développement back-end  >  Pourquoi les noms de fonctions et les pointeurs de fonctions sont-ils équivalents en C ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-11-12 21:09:01599parcourir

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)();

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!

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 *)

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!

Déclaration:
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