Typedef Синтаксис функции - PullRequest
1 голос
/ 14 марта 2012

У меня есть следующий typedef прототип функции:

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

Я понятия не имею, как его использовать.Я понимаю, что (int, siginfo_t *, void*) является typedef в sa_sigaction_t.Но как бы я использовал это?Это все возвращаемые типы без указания имен переменных.

Поэтому я предполагаю, что хочу создать переменную: sa_sigaction_t handler.Как бы я использовал это?Синтаксис довольно запутанный.

Спасибо,

Ответы [ 3 ]

1 голос
/ 14 марта 2012

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 голос
/ 14 марта 2012

Я понимаю, что (int, siginfo_t , void ) определено как type-def в 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);
0 голосов
/ 14 марта 2012

Если у вас объявлен указатель на функцию:

sa_sigaction_t handler;

Вы можете назвать это как:

handler( ... );

Подсказка в скобках, правда. void (*sa_sigaction_t) отличается от void *sa_sigaction_t.

...