我有以下typedef
函数原型:
typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
我不知道如何使用它。我了解(int, siginfo_t *, void*)
是typedef
- 编入sa_sigaction_t
。但是我该如何使用它呢?这些都是没有指定变量名的返回类型。
所以我假设我想创建一个变量:sa_sigaction_t handler
。我该如何使用它?语法很混乱。
谢谢,
答案 0 :(得分:1)
在这种情况下,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
,但这些都是相同的。
答案 1 :(得分:1)
我理解(int,siginfo_t ,void )是在sa_sigaction_t中的类型定义。
其实没有。 sa_sigaction_t
是指向返回void
并将(int, siginfo_t *, void *)
作为参数的函数的指针。
所以如果你有:
void foo(int, siginfo_t*, void*)
{
}
你可以这样做:
sa_sigaction_t fooPtr = &foo;
然后像这样调用它:
fooPtr(0,NULL,NULL);
答案 2 :(得分:0)
如果您声明了一个函数指针:
sa_sigaction_t handler;
你可以这样称呼:
handler( ... );
线索在括号中,真的。 void (*sa_sigaction_t)
与void *sa_sigaction_t
不同。