2012-03-14 9 views
1

は、私は、次のtypedef関数プロトタイプを持っています。 (int, siginfo_t *, void*)typedefで、sa_sigaction_tになっています。しかし、どうすればそれを使うことができますか?これらはすべて、変数名が指定されていない戻り型です。typedefの関数構文

だから私は変数を作成したいと思う:sa_sigaction_t handler。どうすれば使えますか?構文はかなり混乱しています。

おかげで、

答えて

1

私は(int型、のsiginfo_t ボイド)はsa_sigaction_tへのtypedef-EDであることを理解しています。

実際にはありません。 sa_sigaction_tは、voidを返し、パラメータとして(int, siginfo_t *, void *)を受け取る関数へのポインタです。あなたが持っている場合

だから:

sa_sigaction_t fooPtr = &foo; 

をし、このようにそれを呼び出す:

void foo(int, siginfo_t*, void*) 
{ 
} 

をあなたが行うことができます

fooPtr(0,NULL,NULL); 
0

あなたは関数ポインタを持っている場合は、宣言:

sa_sigaction_t handler; 

あなたが好きそれを呼び出すことができます。

handler(...); 

手掛かりが本当に、括弧です。 void (*sa_sigaction_t)void *sa_sigaction_tとは異なります。この場合

1

typedefvoidを返し、3つの引数(intsiginfo_t *void *)をとる関数のための短い手の一種です。これは、たとえば、コールバックとして関数を渡す場合などに便利です。

void func1(sa_sigaction_t handler) 
{ 
    handler(...); 
} 

func1はタイプsa_sigaction_tの任意の関数を呼び出します。あなたはそのようにそれを呼び出すことができます。

void func2(int a, siginfo_t * b, void * c) 
{ 
    ... 
} 

int main(void) 
{ 
    func1(func2); 

    /* 
    * Equivalent to: 
    * sa_sigaction_t handler = func2; 
    * func1(func2); 
    */ 
    return 0; 
} 

一方、あなたはあなたのコードがより冗長になり、typedefを持っていなかった場合:注意すべき

void func1(void(*handler)(int, siginfo_t *, void*)) 
{ 
    handler(...); 
} 

void func2(int a, siginfo_t * b, void * c) 
{ 
    ... 
} 

int main(void) 
{ 
    func1(func2); 

    /* 
    * Equivalent to: 
    * void(*handler)(int, siginfo_t *, void*) = func2; 
    * func1(func2); 
    */ 
    return 0; 
} 

何かが時々あなたが表示されるということですfunc2と他の時間は&func2ですが、どちらも同じです。