typedef 函式指標較好的示例
1. typedef 行為有點像 #define 巨集,用其實際型別替代同義字。
不同點:typedef 在編譯時被解釋,因此讓編譯器來應付超越前處理器能力的文字替換。
2. typedef 用法(1)
typedef給變數型別定義一個別名.
typedef 原變數型別 別名
exp1 : typedef unsigned char uint8_t;
exp2:
typedef struct{
int a;
int b;
}MY_TYPE;
這裡把一個未命名結構直接取了一個叫MY_TYPE的別名, 這樣如果你想定義結構的例項的時候就可以這樣:
MY_TYPE tmp;
注意: 這裡struct 如果用標籤的形式,那就是
struct{
int a;
int b;
}tmp;
或者
struct MY_TYPE{
int a;
int b;
};
struct MY_TYPE tmp;
3. 用typedef 定義函式指標
typedef int (*MYFUN)(int, int);
這種用法一般用在給函式定義別名的時候
上面的例子定義MYFUN 是一個函式指標, 函式型別是帶兩個int 引數, 返回一個int
在分析這種形式的定義的時候可以用下面的方法:
先去掉typedef 和別名, 剩下的就是原變數的型別.
去掉typedef和MYFUN以後就剩:
int (*)(int, int)
下面是一個例子:
1 //#include<iostream.h>
2 #include<stdio.h>
3
4 typedef int (*FP_CALC)(int, int);
5 //注意這裡不是函式宣告而是函式定義,它是一個地址,你可以直接輸出add看看
6 int add(int a, int b)
7 {
8 return a + b;
9 }
10 int sub(int a, int b)
11 {
12 return a - b;
13 }
14 int mul(int a, int b)
15 {
16 return a * b;
17 }
18 int div(int a, int b)
19 {
20 return b? a/b : -1;
21 }
22 //定義一個函式,引數為op,返回一個指標。該指標型別為 擁有兩個int引數、
23 //返回型別為int 的函式指標。它的作用是根據操作符返回相應函式的地址
24 FP_CALC calc_func(char op)
25 {
26 switch (op)
27 {
28 case '+': return add;//返回函式的地址
29 case '-': return sub;
30 case '*': return mul;
31 case '/': return div;
32 default:
33 return NULL;
34 }
35 return NULL;
36 }
37 //s_calc_func為函式,它的引數是 op,
38 //返回值為一個擁有 兩個int引數、返回型別為int 的函式指標
39 int (*s_calc_func(char op)) (int, int)
40 {
41 return calc_func(op);
42 }
43 //終端使用者直接呼叫的函式,該函式接收兩個int整數,和一個算術運算子,返回兩數的運算結果
44 int calc(int a, int b, char op)
45 {
46 FP_CALC fp = calc_func(op); //根據預算符得到各種運算的函式的地址
47 int (*s_fp)(int, int) = s_calc_func(op);//用於測試
48 // ASSERT(fp == s_fp); // 可以斷言這倆是相等的
49 if (fp) return fp(a, b);//根據上一步得到的函式的地址呼叫相應函式,並返回結果
50 else return -1;
51 }
52
53 void main()
54 {
55 int a = 100, b = 20;
56
57 printf("calc(%d, %d, %c) = %d/n", a, b, '+', calc(a, b, '+'));
58 printf("calc(%d, %d, %c) = %d/n", a, b, '-', calc(a, b, '-'));
59 printf("calc(%d, %d, %c) = %d/n", a, b, '*', calc(a, b, '*'));
60 printf("calc(%d, %d, %c) = %d/n", a, b, '/', calc(a, b, '/'));
61 }
62
63
執行結果
calc(100, 20, +) = 120
calc(100, 20, -) = 80
calc(100, 20, *) = 2000
calc(100, 20, /) = 5