1. 程式人生 > >【C++】typedef和#define的用法與區別

【C++】typedef和#define的用法與區別

typedef和define都是替一個物件取一個別名,以此增強程式的可讀性,區別如下:

(1)原理不同

#define是C語言中定義的語法,是預處理指令,在預處理時進行簡單而機械的字串替換,不作正確性檢查,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。

typedef是關鍵字,在編譯時處理,有型別檢查功能。它在自己的作用域內給一個已經存在的型別一個別名,但不能在一個函式定義裡面使用typedef。用typedef定義陣列、指標、結構等型別會帶來很大的方便,不僅使程式書寫簡單,也使意義明確,增強可讀性。

(2)功能不同

typedef用來定義型別的別名,起到型別易於記憶的功能。另一個功能是定義機器無關的型別。如定義一個REAL的浮點型別,在目標機器上它可以獲得最高的精度:typedef long double REAL, 在不支援long double的機器上,看起來是這樣的,typedef double REAL,在不支援double的機器上,是這樣的,typedef float REAL

#define不只是可以為型別取別名,還可以定義常量、變數、編譯開關等。

(3)作用域不同

#define沒有作用域的限制,只要是之前預定義過的巨集,在以後的程式中都可以使用,而typedef有自己的作用域。

(4)對指標的操作不同

#define INTPTR1 int*

typedef int* INTPTR2;

INTPTR1 p1, p2;

INTPTR2 p3, p4;

含義分別為,

宣告一個指標變數p1和一個整型變數p2

宣告兩個指標變數p3、p4

#define INTPTR1 int*

typedef int* INTPTR2;

int a = 1;

int b = 2;

int c = 3;

const INTPTR1 p1 = &a;

const INTPTR2 p2 = &b;

INTPTR2 const p3 = &c;

上述程式碼中,

const INTPTR1 p1是一個常量指標,即不可以通過p1去修改p1指向的內容,但是p1可以指向其他內容。

const INTPTR2 p2是一個指標常量,不可使p2再指向其他內容。因為INTPTR2表示一個指標型別,因此用const限定,表示封鎖了這個指標型別。(這是使用typedef需要特別注意的地方)

INTPTR2 const p3是一個指標常量。

 

參考

https://blog.csdn.net/summer00072/article/details/80918483