Pourquoi le nom de fonction est-il équivalent au pointeur de fonction avec l'adresse de l'opérateur ?
En programmation C, utiliser un nom de fonction comme pointeur de fonction équivaut à appliquer l’opérateur d’adresse de (&) au nom de la fonction. Cette apparente incohérence avec d'autres éléments du langage, tels que les tableaux, a une justification spécifique.
Raison d'être de l'équivalence du nom de fonction
Selon le document ANSI C90 Justification, l'équivalence entre les désignateurs de fonction (noms de fonction) et les pointeurs de fonction a été introduit pour améliorer la commodité. En autorisant les deux notations, le langage fournit un moyen abrégé d'appeler des fonctions membres dans des structures packagées. Par exemple :
graphics.open(file) // Equivalent to (*graphics.open)(file)
Curiosités des désignateurs de fonctions
Cette équivalence conduit à des formes syntaxiques particulières mais valides :
( &f)(); f(); (*f)(); (**f)(); (***f)(); pf(); (*pf)(); (**pf)(); (***pf)();
Le Comité a raisonné qu'interdire des formulaires comme (f)() tout en autorisant a (pour int a[]) aurait été inutile et peu pratique.
Exceptions dans les types de paramètres et de retour
Fait intéressant, un type de fonction peut être implicitement converti en un pointeur vers lui-même en tant que paramètre (par exemple, void g(FunctionType)). Cependant, il ne peut pas être converti en pointeur lorsqu'il est utilisé comme type de retour (par exemple, FunctionType h();). Cette distinction garantit que les problèmes de compatibilité des types de fonctions sont évités.
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!