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?
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. –
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