Peut un prototype de fonction typedef être utilisé dans la définition d'une fonction?
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 leur simplifier la définition et de la déclaration. Bien sûr, je pourrais utiliser une macro comme ça:
#define SP_FUNC(name) int name(int a, int b)
Mais je tiens à le garder en C, j'ai donc essayé d'utiliser l'espace de stockage spécificateur de typedef
pour cela:
typedef int SpFunc(int a, int b);
Cela semble bien fonctionner pour la déclaration:
SpFunc func1; //compiles
mais pas pour la définition:
SpFunc func1 {
//...
}
qui me donne l'erreur suivante:
error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
Est-il un moyen de le faire correctement ou est-ce impossible?
Ma compréhension de C cela devrait fonctionner, mais il ne le fait pas. Pourquoi?
Note, gcc comprend ce que je suis en train 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.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas définir une fonction à l'aide d'une définition de type pour un type de fonction. Il est explicitement interdit - reportez-vous à 6.9.1/2 et de la note de bas de page:
Un
typedef
définit un type, pas un en-tête (qui est le code source du texte). Vous devez utiliser#define
(bien que je ne le recommande pas) si vous avez besoin de factoriser le code d'en-tête.([Édité] La raison la première, c'est que ce n'est pas la définition d'un prototype -- c'est la définition d'une variable du type défini par la
typedef
, ce qui n'est pas ce que vous voulez.)typedef int (*SpFunc)(int a, int b);
. Et depuis la déclaration est valide, il est un bon type de fonction. La question est de savoir pourquoi je ne peut pas l'utiliser pour la définition.type name {body}
, ce qui serait un changement souhaitable, si c'était possible. Le vôtre est l'un de ces ennuyeux réponses à "pourquoi je ne peux pas faire cela" qui dit simplement "vous ne pouvez rien faire" (alors que les conférences de l'OP sur ce qu'ils savent déjà), comme si la définition du langage ont été immuable raw fait de l'univers sans rime ni raison.