Искам да запазя указател към функция в глобална променлива

Така че си помислих, че това ще бъде ясно, но продължавам да получавам грешки при компилиране, което вероятно означава, че правя нещо глупаво.

Така че използвам 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

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

Test.h връща int

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

Вероятно сте имали предвид void, тъй като не връща нищо

person The Archetypal Paul    schedule 22.11.2010