最近在看posix實時信號時,遇到一處函數是如此定義的:
1
typedef void sigfunc_rt(int, siginfo_t *, void *);
在我常規理解裡,一般定義一個函數類型都是這樣定義的:
1
typedef void (*sighandler_t)(int);
2
sighandler_t signal(int signum, sighandler_t handler);
其實是這樣的,對於函數,typedef有兩類自定義類型:
首先我們要先明白一個概念,函數名是不是指針?也就是說一個函數名可不可以代表一個地址?以及什麼是函數類型?
經過查找,函數名就是一個指針,但是意義是不一樣的,如同於數組a[],a和&a其實都是一樣的。當調用一個函數時,我們都是直接用函數名調用,或者說通過指針調用。
函數類型,在我理解,就是定義了一個函數返回值類型以及參數類型。
那麼:
1,tpyedef自定義函數指針類型:
看一個例子:
01
#include <stdio.h>
02
03
typedef int (*fp_t)(char c);
04
05
int f0(char c) { printf("f0, c = %c\n", c); return 0;}
06
int f1(char c) { printf("f1, c = %c\n", c); return 1;}
07
08
int main()
09
{
10
int ret;
11
fp_t fp;//fp是一個指向一個函數類型(返回的是int,參數是char)的函數指針
12
13
fp = f0;
14
ret = fp('a');通過函數指針調用函數
15
16
fp = f1;
17
ret = fp('x');
18
return 0;
19
}
2,typedef自定義函數類型:
例子:
01
#include <stdio.h>
02
03
typedef int f_t(char c);
04
05
int f0(char c) { printf("f0, c = %c\n", c); return 0;}
06
int f1(char c) { printf("f1, c = %c\n", c); return 1;}
07
08
int main()
09
{
10
int ret;
11
f_t *fp;//f_t是函數類型,所以fp是指向此函數類型的指針
12
13
fp = f0;
14
ret = fp('a');
15
16 www.2cto.com
fp = f1;
17
ret = fp('x');//函數指針調用此函數
18
return 0;
19
}