2012-03-14 8 views
1

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

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

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

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

Спасибо,

ответ

1

Я понимаю, что (интермедиат, siginfo_t , недействительный) является ЬурейиМ-й издом в 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

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

sa_sigaction_t handler; 

Вы можете назвать это нравится:

handler(...); 

Ключ находится в скобках, на самом деле. void (*sa_sigaction_t) отличается от void *sa_sigaction_t.

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, но это то же самое.

Смежные вопросы