1. typedef 最簡單使用編程
1 typedef long byte_4; // 給已知數據類型long起個新名字,叫byte_4
你能夠在任何須要 long 的上下文中使用 byte_4。注意 typedef 並不建立新的類型。它僅僅爲現有類型添加一個同義字。數組
2. typedef 修飾數組函數
1 typedef char mySizes[100]; 2 mySizes xxx; 3 4 typedef char [100] mySizes; //error
這裏 mySize 就是一個大小爲100的 char 數組,sizeof(mySize) 爲 100。spa
3. typedef 修飾指針.net
1 typedef char * pstr; 2 int mystrcmp(pstr, pstr); 3 ...... 4 int mystrcmp(const pstr, const pstr); //error
這裏有一個 typedef 陷阱。標準函數 strcmp()有兩個‘const char *’類型的參數。所以,它可能會誤導人們象上面這樣聲明。指針
按照順序,‘const pstr’被解釋爲‘char * const’(一個指向 char 的常量指針),而不是‘const char *’(指向常量 char 的指針)。code
其實這點很好理解,const 就是修飾 pstr 指針的,並非簡單替換。blog
這個問題很容易解決:字符串
1 typedef const char * cpstr; 2 int mystrcmp(cpstr, cpstr); // 如今是正確的
4. typedef 修飾結構體編譯器
1 typedef struct tagMyStruct 2 { 3 int iNum; 4 long lLength; 5 } MyStruct;
這語句實際上完成兩個操做:
(1).定義一個新的結構類型
1 struct tagMyStruct 2 { 3 int iNum; 4 long lLength; 5 };
分析:
tagMyStruct ,其實是一個臨時名字,struct 關鍵字和 tagMyStruct一塊兒,構成了這個結構類型,不管是否有typedef,這個結構都存在。
咱們能夠用 struct tagMyStruct xxName 來定義變量,但要注意,使用tagMyStruct xxxrName 來定義變量是不對的,由於struct 和tagMyStruct合在一塊兒才能表示一個結構類型。
(2). typedef 爲這個新的結構起了一個名字,叫 MyStruct。
typedef struct tagMyStruct MyStruct;所以,MyStruct實際上至關於struct tagMyStruct,咱們可使用MyStruct varName來定義變量。
5. typedef & 結構的問題
在結構中包含指向它本身的指針
1 typedef struct tagNode 2 { 3 char *pItem; 4 pNode pNext; // error 5 } *pNode;
答案與分析:
根據咱們上面的闡述能夠知道:要知道pNode表示的是類型的新名字,那麼在類型自己尚未創建完成的時候,這個類型的新名字 pNoed 也還不存在,也就是說這個時候編譯器根本不認識pNode。
解決這個問題的方法有多種:
1 // 1) 2 typedef struct tagNode 3 { 4 char *pItem; 5 struct tagNode *pNext; 6 } *pNode; 7 8 // 2) 9 typedef struct tagNode* pNode; 10 struct tagNode 11 { 12 char *pItem; 13 pNode pNext; 14 }; 15 //注意:在這個例子中,你用 typedef 給一個還未徹底聲明的類型起新名字。C語言編譯器支持這種作法。 16 17 // 3)規範作法: 18 struct tagNode 19 { 20 char *pItem; 21 struct tagNode *pNext; 22 }; 23 typedef struct tagNode *pNode;
6. typedef 與 #define的問題
有下面兩種定義pStr數據類型的方法,二者有什麼不一樣?哪種更好一點?
1 typedef char* pStr; 2 #define pStr char*;
答案與分析:
一般講,typedef要比#define要好,特別是在有指針的場合。
請看例子:
1 typedef char* pStr1; 2 #define pStr2 char * 3 pStr1 s1, s2; // char* s1; char* s2; 4 pStr2 s3, s4; // char* s3, s4;即 char s4;
在上述的變量定義中,s4則定義成了char,不是咱們所預期的指針變量,根本緣由就在於#define只是簡單的字符串替換而typedef則是爲一個類型起新名字。
上例中define語句必須寫成 pStr2 s3, *s4; 這這樣才能正常執行。
7. typedef 與 複雜的變量聲明
在編程實踐中,尤爲是看別人代碼的時候,經常會遇到比較複雜的變量聲明,使用typedef做簡化自有其價值,好比:
下面是三個變量的聲明,我想使用typdef分別給它們定義一個別名,請問該如何作?
1 int *(*a[5])(int, char*); 2 3 void (*b[10]) (void (*)()); 4 5 double(*)() (*pa)[9];
答案與分析:
對複雜變量創建一個類型別名的方法很簡單,你只要在傳統的變量聲明表達式裏用類型名替代變量名,而後把關鍵字typedef加在該語句的開頭就好了。
8. typedef 修飾函數指針
1 //1. 定義一個函數指針 2 typedef int(_cdecl *FUN_Start)(UCHAR); 3 /* typedef的功能是定義新的類型。定義這種類型爲指向某種函數的指針,這函數以一個UCHAO爲參數並返回int類型。*/ 4 5 //2. 定義這個函數指針的一個變量 6 FUN_Start fun_Start; 7 8 //3. 把函數的地址賦給此函數指針 9 fun_Start = (FUN_Start)GetProcAddress(m_hLibrary,"Rec_SetDevice"); 10 11 //4. 調用 12 if (fun_Start('a') == 1) //直接經過函數指針調用 13 {......} 14 15 //固然也能夠這樣 16 if ( (*)fun_Start('a') == 1) //先用*fun_start取出它所指的函數類型,再調用 17 {......}
由於函數名就是一個地址,該函數名所表明的函數的入口地址。
ref:http://blog.csdn.net/lwbeyond/article/details/6191942