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

J’ai une série de fonctions avec le même prototype, disons

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 celle-ci:

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

Mais j’aimerais le conserver 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 bien fonctionner pour la déclaration:

 SpFunc func1; // comstacks 

mais pas pour la définition:

 SpFunc func1 { // ... } 

ce qui me donne l’erreur suivante:

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

Y at-il un moyen de le faire correctement ou est-ce impossible? À ma connaissance, cela devrait fonctionner, mais cela ne fonctionne pas. Pourquoi?


Notez que gcc comprend ce que j’essaie de faire, car si j’écris

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

ça me dit

 error: function 'func1' is initialized like a variable 

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

    Vous ne pouvez pas définir une fonction à l’aide d’un typedef pour un type de fonction. C’est explicitement interdit – voir 6.9.1 / 2 et la note de bas de page correspondante:

    L’identi fi cateur 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 puisse 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 

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

    ([Edité] La première raison est que le logiciel ne définit pas un prototype – il définit une variable du type défini par la typedef , ce qui n’est pas ce que vous voulez.)