2010-11-22 2 views
2

Alors j'ai pensé que ce serait simple, mais je continue à recevoir des erreurs de compilation, ce qui signifie probablement que je fais quelque chose de stupide. Donc, j'utilise C et je veux enregistrer un pointeur sur une fonction dans une variable globale.Je veux enregistrer un pointeur sur une fonction dans une variable globale

En tant que test, j'ai trois fichiers. Test.c, Test.h et FunctionPtr.c

Test.h va comme ceci

void (*MyCallBack)(void); 

int SetFunc(void (*CallBackArg)(void)); 
void CallFunc(); 

test.c va comme ceci

#include <stdio.h> 
#include <stdlib.h> 
#include "test.h" 
void SetFunc(void (*CallBackArg)(void)){ 

    printf("Set CallBack\n"); 
    MyCallBack=CallBackArg; 
} 

void CallFunc(){ 
    printf("In Call Func\n"); 
    MyCallBack(); 
} 

et FunctionTest.c va comme ceci

#include <stdio.h> 
#include <stdlib.h> 
#include "test.h" 


void MyFunc(){ 
    printf("Work!\n"); 
} 
int main() 
{ 
    SetFunc(MyFunc); 
    CallFunc(); 

} 

Lorsque je compile en utilisant gcc FunctionTest.c test.c test.h -o FonctionTest

que je reçois l'erreur suivante ...

test.c: 4: erreur: types contradictoires pour 'SetFunc' test.h: 4: Note: déclaration précédente de 'SetFunc' était ici

Je ne peux pas comprendre ce que je fais mal? Peut-être que je ne déclare pas le Global Pointer?

+0

pas que compte beaucoup, mais votre fonction 'Callback' elle-même n'a aucun prototype. Contrairement à C++, déclarer une fonction sans ses arguments dit qu'elle peut recevoir un nombre indéterminé d'arguments. Donne-lui un «vide» là-bas, afin que tous tes trois prototypes soient d'accord. La meilleure pratique pour les arguments de pointeur de fonction serait de déclarer un typedef et de l'utiliser. –

+1

Dans _Test.h_ vous avez 'void (* MyCallBack) (void);', qui est une déclaration de variable. Chaque fichier incluant _Test.h_ pourrait avoir sa propre copie de cette variable. Vous devriez avoir 'extern void (* MyCallBack) (void);' dans _Test.h_ et 'void (* MyCallBack) (void);' dans _Test.c_ – nategoose

Répondre

2

Les types de retour sont différents, c'est votre problème. Vous devez le déclarer de la même manière dans l'en-tête que dans le fichier .c.

+0

Ouais votre droite, c'est la raison pour laquelle ce fichier de test n'est pas travail. – MAC

+0

Mais ensuite j'ai regardé le code réel dans mon projet et il s'est avéré que le vrai problème était que je faisais un void (* MyCallBack) (void) = NULL; et cela provoquait le compilateur à donner ces erreurs cryptiques. Merci – MAC

1

Test.c a le retourner vide

void SetFunc(void (*CallBackArg)(void)){ 

Test.h a le retourner int

int SetFunc(void (*CallBackArg)(void)); 

On peut supposer que vous vouliez dire vide, car il ne retourne rien

Questions connexes