close
typedef 知多少?
 

        很多寫 C/C++ 的人都把 typedef 當成#define 來使用。誠然,像這樣的定義

typedef unsigned short WORD;

就相當於

#define WORD unsigned short

但就本義來說,#define 是字串的取代,例如 #define WORD Hello! 編譯器不會有任何的抗議就通過的,在程式任何使用到 WORD 的地方 編譯器會忠實的用 Hello! 取代 WORD 由於取代的字串可不限於一行且可代入參數,所以#define 可用於 Macro 的定義如 #define max(a,b) (((a) > (b)) ? (a) : (b)) 回過頭來說typedef主題,從本義來說typedef是 C/C++ 型態的別名。 所以若你想把 #define WORD Hello! 套在 typedef 的身上: typedef Hello! WORD; 那麼編譯器會給你一個難堪錯誤訊息!因為 Hello! 不是一個合法的 型態,你不能為它取型態別名。 typedef看來不怎麼有用是吧!?非也,由於所謂 C/C++ 的型態是很廣義的,使用typedef 可以使程式看起來簡潔易懂且不容易出錯。下面是幾個typedef的應用例子: 簡單型態的別名 typedef unsigned char BYTE;//定義無號單字節的型態 typedef unsigned short WORD;//定義無號雙字節的型態 typedef unsigned long DWORD;//定義無號四字節的型態 //嗯!這三行沒什麼大不了,用#define也可以做 結構型態的別名 typedef struct StructTag{ int mA; int mB; }STRUCTTAG, *PSTRUCTTAG; 當要建立這個結構的物件時,就可以用別名 STRUCTTAG 和 PSTRUCTTAG,例如 STRUCTTAG StructObj; PSTRUCTTAG pStructObj; 就相當於 struct StructTag StructObj; struct StructTag *pStructObj; 函式型態的別名 如果你有一個 library 提供了字串轉整數的函式 int HexToInt(char *str);//十六進位字串轉整數 int DecToInt(char *str);//十進位字串轉整數 當你的程式要使用這些函式時,就必需include這些函式的定義,但用typedef會 更簡潔:

 typedef int ToInt(char *str);

 //上面這行定義了一個需傳入字串(char *)且返回整數(int)的函式型態別名 //叫 ToInt ToInt HexToInt,DecToInt;//宣告HexToInt,DecToInt這兩個函式 現在你的程式可以呼叫HexToInt(...),DecToInt(...)了。
        在Windows,通常是應用程式呼叫API來工作的,但由於某種需求,
Windows API 會反過來呼叫應用程式的函式,這種函式稱之為 callback  function

        callback function 對API來說只有該傳入那些參數和返回值型態,沒有
函式名稱而用函式 指標來呼叫(事實上Windows也不可能用程式的函式名稱
來呼叫)。這時使用函式型態的別名 來宣告函式指標就特別好用了。 舉個例
子吧!建立一個新的行程(Thread)的函式:

CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

其中AFX_THREADPROC就是一個函式型態的別名 它的定義是

 typedef UINT (AFX_CDECL *AFX_THREADPROC)(LPVOID);

 //AFX_THREADPROC 是一個傳入一個指標參數返回UINT型態值的函式
 //指標的名稱(AFX_CDEL是標明函式呼叫為 __cdecl(C style calling convention))
 用這個宣告,不論API或應用程式本身都很方便,如應用程式可以這樣來
 開啟行程:

CWinThread* pMyThread=AfxBeginThread((AFX_THREADPROC)MyThreadFunc,............

是不是很簡潔明瞭?嗯...MyThreadFunc算不算 callback function 有點疑義,但
做為 typedef 的使用例子應沒問題的 ~

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Bluelove1968 的頭像
    Bluelove1968

    藍色情懷

    Bluelove1968 發表在 痞客邦 留言(0) 人氣()