2014-06-05 4 views
4

j'ai vu un code BSD en utilisant la construction suivante:Que signifie typedef int function (void *)?

typedef int driver_filter_t(void*); 

Qu'est-ce que cela signifie exactement? Je ne pense pas que ce soit un pointeur de fonction car sinon ce serait quelque chose comme typedef int (*driver_filter_t)(void*), non?

Répondre

8
typedef int driver_filter_t(void*); 

C'est une définition d'un type de fonction . Il fait driver_filter_t un alias pour le type qui peut être décrit comme "fonction retournant int avec un argument de type pointeur à void".

Comme pour tous typedef s, il crée un alias pour un type existant, pas un nouveau type.

driver_filter_t est et non un type de pointeur. Vous ne pouvez pas déclarer quelque chose du type driver_filter_t (la grammaire ne permet pas de déclarer une fonction en utilisant un nom typedef). Vous pouvez déclarer un objet qui est un pointeur de fonction, par exemple:

driver_filter_t *func_ptr; 

Parce que vous ne pouvez pas utiliser un nom de type de fonction directement, sans l'ajout d'un * pour désigner un type de pointeur, il est probablement plus fréquent de définir typedef s pour les types de pointeur de fonction, tels que:

typedef int (*driver_filter_pointer)(void*); 

Mais typedefs pour les types de fonction sont pefectly juridiques, et personnellement je les trouve plus claire.

+0

Grande réponse. J'aurais aimé que K & R accorde plus d'attention à ce genre de choses dans leur livre au lieu de se précipiter dans la langue. En termes pratiques, quelle serait la différence entre utiliser un typedef pour un type de fonction et un typedef pour un pointeur de fonction, puisque vous aurez affaire à des pointeurs de toute façon? Y at-il quelque chose que vous pouvez faire avec le premier que vous ne pouvez pas faire avec le dernier? Merci beaucoup! – Martin

1

typedef int driver_filter_t(void*); est un typedef pour un type de fonction. En C, vous pouvez l'utiliser pour des pointeurs de fonction comme driver_filter_t* fn_ptr.

En C++, vous pouvez également utiliser ce typedef pour déclarer des fonctions membres (mais pas de les mettre en œuvre):

struct Some { 
    driver_filter_t foo; // int foo(void*); 
    driver_filter_t bar; // int bar(void*); 
}; 
+2

Salut Maxim. Juste mon avis, mais le PO a étiqueté cette question spécifiquement pour C. Il est intéressant que vous pouvez déclarer des fonctions membres pour C++ comme vous le montrez. Cependant, je pense que cela peut causer de la confusion pour quelqu'un qui commence à se familiariser avec le langage C - d'autant plus que vous ne pouvez pas utiliser cette syntaxe dans C. –

+0

@embedded_guy Les gens confus se font clarifier ici. –

+1

Vous pouvez également utiliser le typedef à la place d'une déclaration de fonction en C, par ex. 'driver_filter_t filterA, filterB, filterC;' à la place de 'int filterA (void *); int filterB (void *); ... ' – tab

Questions connexes