Typedef函数语法

时间:2012-03-14 12:14:33

标签: c function variables typedef

我有以下typedef函数原型:

typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);

我不知道如何使用它。我了解(int, siginfo_t *, void*)typedef - 编入sa_sigaction_t。但是我该如何使用它呢?这些都是没有指定变量名的返回类型。

所以我假设我想创建一个变量:sa_sigaction_t handler。我该如何使用它?语法很混乱。

谢谢,

3 个答案:

答案 0 :(得分:1)

在这种情况下,typedef是一个函数的简写,它返回void并获取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,但这些都是相同的。

答案 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不同。