Поэтому я думал, что это будет прямолинейно, но я продолжаю получать ошибки компиляции, что, вероятно, означает, что я делаю что-то глупое.
Итак, я использую 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