Dans l'un de mes fichiers source de projet, j'ai trouvé cette définition de fonction C:
int (foo) (int *bar)
{
return foo (bar);
}
Remarque: il n'y a pas d'astérisque à côté foo
, donc ce n'est pas un pointeur de fonction. Ou est-ce? Que se passe-t-il ici avec l'appel récursif?
c
function
parentheses
user1859094
la source
la source
a(b);
? Déclaration deb
comme variable de typea
? Ou un appel à la fonctiona
avec argumentb
? La différence est syntaxique, et vous ne pouvez pas savoir de quelle manière même l'analyser sans rechercher les informations de déclaration dea
; c'est-à-dire sont ces parenthèses d'appel de fonction postfix, ou des parenthèses facultatives autour d'un déclarant.Réponses:
En l’absence de tout préprocesseur en cours,
foo
la signature deLe seul contexte dans lequel j'ai vu des gens mettre des parenthèses apparemment inutiles autour des noms de fonction est quand il y a à la fois une fonction et une macro de type fonction avec le même nom, et que le programmeur veut empêcher l'expansion des macros.
Cette pratique peut sembler un peu étrange au début, mais la bibliothèque C crée un précédent en fournissant des macros et des fonctions avec des noms identiques .
L'une de ces paires fonction / macro est
isdigit()
. La bibliothèque peut le définir comme suit:Votre fonction est presque identique à celle ci-dessus, donc je pense que c'est aussi ce qui se passe dans votre code.
la source
foo(bar)
intérieur de la fonction utilise la macro correspondante.foo (int* bar)
serait donc remplacée, mais pas(foo) (int *bar)
(le jeton suivant aprèsfoo
est)
)(isdigit)(5)
:?Les parenthèses ne changent pas la déclaration - il s'agit simplement de définir une fonction ordinaire appelée
foo
.La raison pour laquelle ils ont été utilisés est presque certainement parce qu'il existe une macro de type fonction appelée
foo
defined:L'utilisation
(foo)
de la déclaration de fonction empêche cette macro d'être développée ici. Donc, ce qui se passe probablement, c'est qu'une fonctionfoo()
est définie avec son corps étendu à partir de la macro de type fonctionfoo
.la source
Les parenthèses n'ont aucun sens.
Le code que vous montrez n'est qu'une récursion infinie.
Lorsque vous définissez un pointeur de fonction, vous voyez parfois d'étranges parenthèses qui signifient quelque chose. Mais ce n'est pas le cas ici.
la source