web-dev-qa-db-fra.com

Que signifient les parenthèses autour d'un nom de fonction?

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é de foo, donc ce n'est pas un pointeur de fonction. Ou est-ce? Que se passe-t-il ici avec l'appel récursif?

213
user1859094

En l'absence de tout préprocesseur en cours, la signature de foo est équivalente à

int foo (int *bar)

Le 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 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 par 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:

/* the macro */
#define isdigit(c) ...

/* the function */
int (isdigit)(int c) /* avoid the macro through the use of parentheses */
{
  return isdigit(c); /* use the macro */
}

Votre fonction est presque identique à celle ci-dessus, donc je soupçonne que c'est aussi ce qui se passe dans votre code.

329
NPE

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 définie:

#define foo(x) ...

L'utilisation de (foo) Dans 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 fonction foo() est en cours de définition avec son corps développé à partir de la macro de fonction foo.

37
caf