は、私は、次のtypedef
関数プロトタイプを持っています。 (int, siginfo_t *, void*)
はtypedef
で、sa_sigaction_t
になっています。しかし、どうすればそれを使うことができますか?これらはすべて、変数名が指定されていない戻り型です。typedefの関数構文
だから私は変数を作成したいと思う:sa_sigaction_t handler
。どうすれば使えますか?構文はかなり混乱しています。
おかげで、
は、私は、次のtypedef
関数プロトタイプを持っています。 (int, siginfo_t *, void*)
はtypedef
で、sa_sigaction_t
になっています。しかし、どうすればそれを使うことができますか?これらはすべて、変数名が指定されていない戻り型です。typedefの関数構文
だから私は変数を作成したいと思う:sa_sigaction_t handler
。どうすれば使えますか?構文はかなり混乱しています。
おかげで、
私は(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);
あなたは関数ポインタを持っている場合は、宣言:
sa_sigaction_t handler;
あなたが好きそれを呼び出すことができます。
handler(...);
手掛かりが本当に、括弧です。 void (*sa_sigaction_t)
はvoid *sa_sigaction_t
とは異なります。この場合
typedef
はvoid
を返し、3つの引数(int
、siginfo_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
ですが、どちらも同じです。