【转】typedef函数指针的用法(C++)
| 代碼簡化, 促進跨平臺開發(fā)的目的. typedef 行為有點像 #define 宏,用其實際類型替代同義字。 不同點:typedef 在編譯時被解釋,因此讓編譯器來應(yīng)付超越預(yù)處理器能力的文本替換。 用法一: typedef?int?(*MYFUN)(int, int); 用法二: typedef給變量類型定義一個別名. typedef?struct{ 第二種用法:typedef?原變量類型?別名 typedef補充內(nèi)容: 例如: typedef int (*PF) (const char *, const char *);這個聲明引入了?PF 類型作為函數(shù)指針的同義字,該函數(shù)有兩個 const char * 類型的參數(shù)以及一個 int 類型的返回值。 簡單的函數(shù)指針的用法 //形式1:返回類型(*函數(shù)名)(參數(shù)表) char(*pFun)(int); char glFun(int a){return;} void main() { pFun =glFun; (*pFun)(2); } 第一行定義了一個指針變量pFun.它是一個指向某種函數(shù)的指針,這種函數(shù)參數(shù)是一個int類型,返回值是char類型。只有第一句我們還無法使用這個指針,因為我們還未對它進行賦值。 第二行定義了一個函數(shù)glFun().該函數(shù)正好是一個以int為參數(shù)返回char的函數(shù)。我們要從指針的層次上理解函數(shù)-函數(shù)的函數(shù)名實際上就是一個指針,函數(shù)名指向該函數(shù)的代碼在內(nèi)存中的首地址。 使用typedef更直接 typedef?char(*PTRFUN)(int) PTRFUN pFun; char glFun(int a){return;} void main() { pFun = glFun; (*pFun)(2); } typedef的功能是定義新的類型。第一句就是定義了一種PTRFUN的類型,并定義這種類型為指向某種函數(shù)的指針,這種函數(shù)以一個int為參數(shù)并返回char類型。 // 下面是個例子: // 在typedef的使用中,最麻煩的是指向函數(shù)的指針,如果沒有下面的函數(shù),你知道下面這個表達式的定義以及如何使用它嗎? ? int (*s_calc_func(char op))(int, int);
?
int add(int, int); int sub(int, int); int mul(int, int); int div(int, int); // 定義指向這類函數(shù)的指針 typedef int (*FP_CALC)(int, int);
int (*s_calc_func(char op))(int, int);
// 定義一個函數(shù)calc_func,它根據(jù)操作字符 op 返回指向相應(yīng)的計算函數(shù)的指針 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; } // 這個函數(shù)的用途與下一個函數(shù)作業(yè)和調(diào)用方式的完全相同, // 參數(shù)為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); // 下面是類似的直接定義指向函數(shù)指針變量 ???????// 下面這行是不用typedef,來實現(xiàn)指向函數(shù)的指針的例子,麻煩! ????????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 |
轉(zhuǎn)載于:https://www.cnblogs.com/kegeyang/archive/2012/03/24/2415097.html
總結(jié)
以上是生活随笔為你收集整理的【转】typedef函数指针的用法(C++)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快排函数的使用语法
- 下一篇: 代码是写给人看的,请C/C++过来的程序