Я хочу сохранить указатель на функцию в глобальной переменной

Поэтому я думал, что это будет прямолинейно, но я продолжаю получать ошибки компиляции, что, вероятно, означает, что я делаю что-то глупое.

Итак, я использую 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» было здесь

Я не могу понять, что я делаю неправильно? Возможно, я неправильно объявляю глобальный указатель?


person MAC    schedule 22.11.2010    source источник
comment
Не то чтобы это имело большое значение, но сама ваша функция Callback вообще не имеет прототипа. В отличие от C++, объявление функции без аргументов говорит о том, что она может получить неопределенное количество аргументов. Дайте ему void так, чтобы все ваши три прототипа согласовывались. Лучшей практикой для аргументов указателя на функцию было бы объявить typedef и использовать его.   -  person Jens Gustedt    schedule 23.11.2010
comment
В Test.h у вас есть void (*MyCallBack)(void);, объявление переменной. Каждый файл, содержащий Test.h, может получить собственную копию этой переменной. У вас должно быть extern void (*MyCallBack)(void); в Test.h и void (*MyCallBack)(void); в Test.c.   -  person nategoose    schedule 23.11.2010


Ответы (2)


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

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

Типы возврата разные, это ваша проблема. Вы должны объявить его так же в заголовке, как и в файле .c.

person dcp    schedule 22.11.2010
comment
Да, вы правы, именно поэтому этот тестовый файл не работает. - person MAC; 22.11.2010
comment
Но затем я посмотрел на фактический код в моем проекте, и оказалось, что настоящая проблема заключалась в том, что я делал void (*MyCallBack)(void)=NULL; и это заставляло компилятор выдавать эти загадочные ошибки. Спасибо - person MAC; 22.11.2010

Test.c возвращает пустоту

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

Test.h возвращает int

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

Предположительно, вы имели в виду пустоту, так как она ничего не возвращает

person The Archetypal Paul    schedule 22.11.2010