雖然都是為一種型別建立自定義的名字,但之間還是有很打的差別的。
使用形式:
#define my_int int
typedef int my_int
1. 用途一:
用作同時宣告指標型別的多個物件,比如:
int
*pa,pb;
//相當於
int*pa;
int pb;
這裡相當於只定義了乙個指向int
型變數的指標pa
,而pb
是int
整型變數,不是指標。
但是typedef
可以實現定義多個指標型別變數
typedef
(int
*) p_int;
p_int pa,pb;
雖然使用int *pa, *pb;
也可以完成上面操作,但是沒有typedef
直觀簡單,尤其在大量需要指標的地方。
2. 用途二:
在以前**中,宣告struct
新物件時:struct 結構名 物件名
struct rectangle
;// 宣告乙個新物件rec1
struct rectangle rec1;
使用typedef
則可以比原來少寫struct
,在大量使用時比較省時省力。
(需要注意在c++中可以直接結構名 物件名
,即:rectangle rec1;
)
typedef
struct rectangle
rect;
// 宣告乙個新物件rec1
rect rec1;
3. 用途三:
用typedef來定義與平台無關的型別。
當**跨平台時,只需要修改typedef
就可以,不用去改其他原始碼,比如經常使用的uint_32_t
:
4. 用途四:
給指向函式的指標型別起別名
#include
//給指向函式的指標,起了個別名叫mysum
//被指向的函式接收2個int型別的引數,返回值為int型別
typedef
int(
*mysum)
(int
,int);
// 定義乙個sum函式,計算a,b的和
intsum
(int a,
int b)
intmain()
5. 用途五:
為複雜的宣告定義乙個新的簡單的別名。
方法是:在原來的宣告裡逐步用別名替換一部分複雜的宣告,如此迴圈,把帶變數名的部分留在最後替換,得到的就是原宣告的最簡化版。eg:
// 原宣告
void
(*b[10]
)(void(*
)())
;// 先替換右邊括號裡的(void (*)()) ,pfunparam為別名1
// 給指向函式的指標型別,起了個別名叫pfunparam
typedef
void
(*pfunparam)()
;// 再替換左邊的變數,pfunx為別名2
typedef
void
(*pfunx)
(pfunparam)
;//原宣告的最簡化:
pfunx b[10]
;** 還在理解中,上面**怎麼去做應用和實現 *
*
理解複雜宣告可用「右左法則」:從變數名看起,先往右,再往左,碰到乙個圓括號就調轉閱讀的方向;
括號內分析完就調出括號,還是按先右後左的順序迴圈,直到整個宣告分析完,例:
int
(*fun)
(int*)
;//首先找到變數名fun,外面有一對圓括號,左邊有*號,說明fun是乙個指標
//然後看右邊圓括號,這說明(*fun)是乙個函式,所以fun是乙個指向這類函式的指標,即函式指標
//這類函式具有int*型別的形參,返回值型別為int
int
(*fun[5]
)(int*);
//fun右邊是運算子,說明fun具有5個元素的陣列
//fun左邊有*,說明fun的元素是指標(這裡的*不是修飾fun,而是修飾fun[5]陣列的內容)
//看右邊括號,說明fun陣列的元素是函式型別的指標,它指向的函式具有int*型別的形參,返回值型別為int
#define
在「預處理過程」進行巨集的替換與展開,不進行正確性的檢查,無腦替換,不管正確與否都帶入替換,安全性差,在編譯階段可能才會發現錯誤報錯。#define add(a,b) (a+b)
// 正確
add(5+
4)// 錯誤
add(x+
4)
typedef
在「編譯過程」,用來給識別符號或者關鍵字起乙個別名
建議能使用typedef
就不使用#define
#define
行末沒有分號
typedef和define具體的詳細區別
1 define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。例如 define pi 3.1415926 程式中的 area pi r r 會替換為3.1415926 r r 如果你把 define語句中...
typedef和define具體的詳細區別
1 define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。例如 define pi 3.1415926 程式中的 area pi r r 會替換為3.1415926 r r 如果你把 define語句中...
(程式設計基礎)define和typedef的區別
define和typedef有兩個主要的區別 1 可以使用其他型別說明符對巨集型別名進行擴充套件,但是對typedef所定義的型別名不能擴充套件 2 在連續的幾個變數的宣告中,用typedef定義的型別可以保證宣告中所有的變數均為同一種型別,但是define無法保證 具體的兩個區別如下 includ...