Така че си помислих, че това ще бъде ясно, но продължавам да получавам грешки при компилиране, което вероятно означава, че правя нещо глупаво.
Така че използвам C и искам да запазя указател към функция в глобална променлива.
Като тестов случай имам три файла. Test.c, Test.h и FunctionPtr.c
Test.h върви така
void (*MyCallBack)(void);
int SetFunc( void (*CallBackArg)(void));
void CallFunc();
Test.c Става така
#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();
}
и FunctionTest.c върви така
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
void MyFunc(){
printf("Work!\n");
}
int main()
{
SetFunc(MyFunc);
CallFunc();
}
Когато компилирам с помощта на gcc FunctionTest.c test.c test.h -o FunctionTest
Получавам следната грешка...
test.c:4: грешка: конфликтни типове за „SetFunc“ test.h:4: забележка: предишната декларация на „SetFunc“ беше тук
Не мога да разбера какво правя погрешно? Може би не декларирам правилно глобалния указател?
Callback
изобщо няма прототип. За разлика от C++, декларирането на функция без нейните аргументи означава, че тя може да получи неопределен брой аргументи. Дайте муvoid
там, така че всичките ви три прототипа да са съгласни. Най-добрата практика за аргументите на указателя на функцията би била да декларирате typedef и да го използвате. - person Jens Gustedt   schedule 23.11.2010void (*MyCallBack)(void);
, което е декларация на променлива. Всеки файл, който включва Test.h може да получи собствено копие на тази променлива. Трябва да иматеextern void (*MyCallBack)(void);
в Test.h иvoid (*MyCallBack)(void);
в Test.c - person nategoose   schedule 23.11.2010