2009-04-05 9 views
9

j'ai une fonction C qui prend un pointeur de fonction comme argument, il est un destructor que je vais appeler à la fin de mon programme. Voici le prototype de ma fonction:C: pointeur de fonction et typedef problème

int store_dest(void (*routine)(void *)); 

Je veux stocker ce pointeur de fonction dans une structure avec quelques autres infos. Pour avoir une bonne structure, je veux avoir un typedef pour ce pointeur de fonction. Voici mon typedef:

typedef void (*my_destructor)(void *); 

Et voici ma structure:

typedef struct my_struct{ 
    my_destructor dest; 
    other_info ... 
} my_struct; 

Au cours de l'étape d'initialisation, je veux définir le champ « dest » à une fonction de la mine, est le prototype ici de cette fonction:

void* my_dummy_dest(void* foo); 

le problème (en fait, il est juste un avertissement, mais je voudrais supprimer) se produit lorsque je tente de régler le « dest » champ de ma structure « my_dummy_dest »:

my_struct.dest = &my_dummy_dest; 

je reçois un "avertissement: attribution du type pointeur incompatible"

Même quand je les compare:

if (my_struct.dest == &my_dummy_dest) 

Je reçois un « avertissement: comparaison des types distincts de pointeur ne dispose pas d'un casting "

Mais je reçois pas d'avertissement quand je mets le champ « dest » avec une autre routine. Je ne comprends pas pourquoi j'ai ces avertissements.

Répondre

11

Votre destructeur factice est déclaré comme renvoyant un pointeur, pas un vide. Cette déclaration ne correspond pas à la typedef de votre pointeur de fonction destructeur.

+0

oups, je savais que c'était quelque chose de stupide comme ça, merci quand même :) – claf

5

Le typedef doit être:

typedef void *(*my_destructor)(void *); 
5

Parce que my_dummy_test retourne void * au lieu de vide. Si vous voulez retourner void *, le typedef devrait être

typedef void* (*my_destructor)(void *); 
Questions connexes