c/c++中typedef詳解

1. typedef 最簡單使用編程

 
  1. 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

相關文章
相關標籤/搜索