原文連接:http://blog.sina.com.cn/s/blog_5e71ee700100fo13.html
代碼簡化, 促進跨平臺開發的目的. typedef 行爲有點像 #define 宏,用其實際類型替代同義字。 不同點:typedef 在編譯時被解釋,因此讓編譯器來應付超越預處理器能力的文本替換。 用法一:
typedef int (*MYFUN)(int,
int); 用法二: typedef給變量類型定義一個別名.
typedef struct{ 第二種用法:typedef 原變量類型 別名 typedef補充內容: 例如: typedef int (*PF) (const char *, const char *); 這個聲明引入了 PF 類型作爲函數指針的同義字,該函數有兩個 const char * 類型的參數以及一個 int 類型的返回值。 簡單的函數指針的用法 //形式1:返回類型(*函數名)(參數表) char(*pFun)(int); char glFun(int a){return;} void main() { pFun =glFun; (*pFun)(2); } 第一行定義了一個指針變量pFun.它是一個指向某種函數的指針,這種函數參數是一個int類型,返回值是char類型。只有第一句我們還無法使用這個指針,因爲我們還未對它進行賦值。 第二行定義了一個函數glFun().該函數正好是一個以int爲參數返回char的函數。我們要從指針的層次上理解函數-函數的函數名實際上就是一個指針,函數名指向該函數的代碼在內存中的首地址。 使用typedef更直接 typedef char(*PTRFUN)(int) PTRFUN pFun; char glFun(int a){return;} void main() { pFun = glFun; (*pFun)(2); } typedef的功能是定義新的類型。第一句就是定義了一種PTRFUN的類型,並定義這種類型爲指向某種函數的指針,這種函數以一個int爲參數並返回char類型。 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 下面是個例子: ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 在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);
int calc(int a, int b, char op);
{ 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); }
{ switch (op) { case '+': return add; case '-': return sub; case '*': return mul; case '/': return div; default: return NULL; } return NULL; }
{ 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; }
{ 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
原文連接:點擊打開鏈接 |