在typedef的使用中,最麻煩的是指向函數的指標,如果沒有下面的函數,你知道下面這個運算式的定義以及如何使用它嗎?
int (*
s_calc_func(
char op))(
int,
int); 如果不知道,請看下面的程式,裡面有比較詳細的說明
//
定義四個函數
int
add(
int,
int);
int
sub(
int,
int);
int
mul(
int,
int);
int
div(
int,
int);
//
定義指向這類函數的指標
typedef
int (*
FP_CALC)(
int,
int);
//
我先不介紹,大家能看懂下一行的內容嗎?
int (*
s_calc_func(
char op))(
int,
int);
//
下一行的內容與上一行完全相同,
//
定義一個函數
calc_func
,它根據操作字元
op
返回指向相應的計算函數的指標
FP_CALC calc_func(
char op);
//
根據
op
返回相應的計算結果值
int calc(
int a,
int b,
char op);
int add(
int a,
int b){
return a + b;}
int sub(
int a,
int b){
return a - b;}
int mul(
int a,
int b){
return a * b;}
int div(
int a,
int b){
return b? a/b : -1;}
//
這個函數的用途與下一個函數作業和調用方式的完全相同,
//
參數為
op
,而不是最後的兩個整形
int (*s_calc_func(
char op)) (
int,
int){
return calc_func(op);}
FP_CALC calc_func(
char op){
switch (op) {
case '+':
return add;
case '-':
return sub;
case '*':
return mul;
case '/':
return div;
default:
return
NULL; }
return
NULL;}
int calc(
int a,
int b,
char op){
FP_CALC fp = calc_func(op);
//
下面是類似的直接定義指向函數指標變數
//
下面這行是不用
typedef
,來實現指向函數的指標的例子,麻煩!
int (*s_fp)(
int,
int) = s_calc_func(op);
// ASSERT(fp == s_fp); //
可以斷言這倆是相等的
if (fp)
return fp(a, b);
else
return -1;}
void test_fun(){
int a = 100, b = 20; printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+')); printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-')); printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*')); printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));}
運行結果 calc(100, 20, +) = 120 calc(100, 20, -) = 80 calc(100, 20, *) = 2000 calc(100, 20, /) = 5