2010-11-22 24 views
2

これはまっすぐだと思いましたが、コンパイルエラーが続いています。これはおそらく何か愚かなことを意味しています。グローバル変数の関数へのポインタを保存したい

私は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' の前の宣言はここ

だったが私は何が間違っているのか把握できないのですか?おそらく、私はグローバルポインタを正しく宣言していないでしょうか?

+0

ない

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

は、おそらくあなたは、ボイド意味int型、それは何も返さないようTEST.Hは、それが、戻ったのボイド

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

を返すことことがあります多くの問題がありますが、 'Callback'関数自体にはプロトタイプはありません。 C++とは対照的に、引数なしで関数を宣言すると、不特定多数の引数を受け取る可能性があります。 3つのプロトタイプすべてが同意するように、そこに 'void 'を付けてください。関数ポインタ引数のベストプラクティスは、typedefを宣言して使用することです。 –

+1

_Test.h_には変数宣言である 'void(* MyCallBack)(void);'があります。 _Test.h_を含むすべてのファイルは、この変数の独自のコピーを取得する可能性があります。 _Test.c_ – nategoose

答えて

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

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

戻り値の型が違う、それはあなたの問題です。 .cファイルと同じ方法でヘッダーに宣言する必要があります。

+0

で、このテストファイルを使用しない理由はあなたの権利です。作業。 – MAC

+0

しかし、私は私のプロジェクトで実際のコードを見て、実際の問題は私がvoid(* MyCallBack)(void)= NULLを行っていたことが判明した。コンパイラがそのような致命的なエラーを引き起こしていました。 ありがとう – MAC

1

test.cのは、それが

関連する問題