Un prototype de fonction typedef peut-il être utilisé dans les définitions de fonctions?

, j'ai une série de fonctions avec le même prototype, dire

int func1(int a, int b) {
  // ...
}
int func2(int a, int b) {
  // ...
}
// ...

Maintenant, je veux simplifier leur définition et leur déclaration. Bien sûr, je pourrais utiliser une macro comme ça:

#define SP_FUNC(name) int name(int a, int b)

Mais je voudrais le garder en C, alors j'ai essayé d'utiliser le spécificateur de stockage typedef pour ceci:

typedef int SpFunc(int a, int b);

Cela semble fonctionner correctement pour la déclaration:

SpFunc func1; // compiles

, Mais pas pour la définition:

SpFunc func1 {
  // ...
}

Ce Qui me donne l'erreur suivante:

error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token

Y a-t-il un moyen de faire ceci correctement, ou est-ce impossible? Pour ma compréhension de C cela devrait fonctionner, mais ce n'est pas le cas. pourquoi?


Remarque, gcc comprend ce que j'essaie de faire, parce que, si j'écris

SpFunc func1 = { /* ... */ }

Il me dit

error: function 'func1' is initialized like a variable

Ce qui signifie que gcc comprend que SpFunc est un type de fonction.

31

2 réponses

Vous ne pouvez pas définir une fonction en utilisant un typedef pour un type de fonction. C'est explicitement interdit-reportez-vous à 6.9.1 / 2 et à la note de bas de page associée:

L'identificateur déclaré dans une définition de fonction (qui est le nom de la fonction) doit avoir un type de fonction, tel que spécifié par la partie déclarateur de la définition de fonction.

L'intention est que la catégorie de type dans une définition de fonction ne peut pas être héritée d'un typedef:

typedef int F(void); // type F is "function with no parameters
                     // returning int"
F f, g; // f and g both have type compatible with F
F f { /* ... */ } // WRONG: syntax/constraint error
F g() { /* ... */ } // WRONG: declares that g returns a function
int f(void) { /* ... */ } // RIGHT: f has type compatible with F
int g() { /* ... */ } // RIGHT: g has type compatible with F
F *e(void) { /* ... */ } // e returns a pointer to a function
F *((e))(void) { /* ... */ } // same: parentheses irrelevant
int (*fp)(void); // fp points to a function that has type F
F *Fp; //Fp points to a function that has type F
42
répondu Johannes Schaub - litb 2011-01-01 17:51:41

A typedef définit un type , pas un en-tête (qui est le texte du code source). Vous devez utiliser #define (bien que je ne le recommande pas) si vous devez factoriser le code pour l'en-tête.

([Edited] la raison pour laquelle le premier fonctionne est qu'il ne définit pas un prototype - il définit une variable du type défini par le typedef, ce qui n'est pas ce que vous voulez.)

0
répondu Mehrdad 2011-01-01 17:55:41