2010-11-22 5 views
2

그래서 나는 이것이 곧바로 될 줄 알았지 만, 나는 아마도 어리석은 짓을한다는 것을 의미하는 컴파일 오류를 계속합니다.전역 변수에있는 함수에 대한 포인터를 저장하려고합니다

그래서 저는 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'의 이전 선언 여기

했다 내가 뭘 잘못하고 있는지 알아 내지 못하니? 아마도 나는 글로벌 포인터를 선언하지 않을거야?

+0

하지

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

이 아마도 당신이 무효 의미 INT는 아무것도 반환하지 않는 Test.h가이 돌아왔다 무효

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

를 돌려 그 것을 가지고 많은 문제지만'콜백 (callback) '함수 자체에는 전혀 프로토 타입이 없습니다. C++과 달리 인수가없는 함수를 선언하면 불특정 다수의 인수가 수신 될 수 있습니다. 거기에 'void'를 주면 3 가지 프로토 타입 모두가 일치합니다. 함수 포인터 인수에 대한 우수 사례는 typedef를 선언하고이를 사용하는 것입니다. –

+1

_Test.h_에는 변수 선언 인'void (* MyCallBack) (void);'가 있습니다. _Test.h_를 포함하는 모든 파일은이 변수의 자체 사본을 가질 수 있습니다. _Test.c_에서 _Test.h_와'void (* MyCallBack) (void);'에'extern void (* MyCallBack) (void);'를 써야합니다. – nategoose

답변

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

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

반환 유형이 다르므로 문제가됩니다. .c 파일에서와 같이 헤더에서 같은 방법으로 선언해야합니다.

+0

이 테스트 파일을 쓰지 않는 이유가 맞습니다. 작업. – MAC

+0

하지만 내 프로젝트의 실제 코드를 살펴보면 실제 문제는 내가 void (* MyCallBack) (void) = NULL; 컴파일러가 그 암호를 제공하는 원인이되었습니다. 감사합니다. – MAC

1

TEST.C는

관련 문제