2012-03-14 45 views
1

我有以下typedef函數原型:功能的typedef語法

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

我不知道如何使用它。據我所知,(int, siginfo_t *, void*)typedef - 分成sa_sigaction_t。但是,我將如何使用它?這些都是沒有指定變量名稱的返回類型。

所以我假設我想創建一個變量:sa_sigaction_t handler。我將如何使用它?語法很混亂。

感謝,

回答

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); 
0

如果你有一個函數指針聲明:

sa_sigaction_t handler; 

你可以把它想:

handler(...); 

的線索是在括號,真的。 void (*sa_sigaction_t)void *sa_sigaction_t不同。

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,但這些都是同樣的事情。