define和typedef 區別與用法

2021-10-23 13:31:26 字數 2925 閱讀 7115

雖然都是為一種型別建立自定義的名字,但之間還是有很打的差別的。

使用形式:

#define my_int int

typedef int my_int

1. 用途一:

用作同時宣告指標型別的多個物件,比如:

int

*pa,pb;

//相當於

int*pa;

int pb;

這裡相當於只定義了乙個指向int型變數的指標pa,而pbint整型變數,不是指標。

但是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...