これはまっすぐだと思いましたが、コンパイルエラーが続いています。これはおそらく何か愚かなことを意味しています。グローバル変数の関数へのポインタを保存したい
私はCを使用しています。グローバル変数の関数へのポインタを保存します。
私には3つのファイルがあります。 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++とは対照的に、引数なしで関数を宣言すると、不特定多数の引数を受け取る可能性があります。 3つのプロトタイプすべてが同意するように、そこに 'void 'を付けてください。関数ポインタ引数のベストプラクティスは、typedefを宣言して使用することです。 –
_Test.h_には変数宣言である 'void(* MyCallBack)(void);'があります。 _Test.h_を含むすべてのファイルは、この変数の独自のコピーを取得する可能性があります。 _Test.c_ – nategoose