그래서 나는 이것이 곧바로 될 줄 알았지 만, 나는 아마도 어리석은 짓을한다는 것을 의미하는 컴파일 오류를 계속합니다.전역 변수에있는 함수에 대한 포인터를 저장하려고합니다
그래서 저는 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'의 이전 선언 여기했다 내가 뭘 잘못하고 있는지 알아 내지 못하니? 아마도 나는 글로벌 포인터를 선언하지 않을거야?
하지
이 아마도 당신이 무효 의미 INT는 아무것도 반환하지 않는 Test.h가이 돌아왔다 무효를 돌려 그 것을 가지고 많은 문제지만'콜백 (callback) '함수 자체에는 전혀 프로토 타입이 없습니다. C++과 달리 인수가없는 함수를 선언하면 불특정 다수의 인수가 수신 될 수 있습니다. 거기에 'void'를 주면 3 가지 프로토 타입 모두가 일치합니다. 함수 포인터 인수에 대한 우수 사례는 typedef를 선언하고이를 사용하는 것입니다. –
_Test.h_에는 변수 선언 인'void (* MyCallBack) (void);'가 있습니다. _Test.h_를 포함하는 모든 파일은이 변수의 자체 사본을 가질 수 있습니다. _Test.c_에서 _Test.h_와'void (* MyCallBack) (void);'에'extern void (* MyCallBack) (void);'를 써야합니다. – nategoose