當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > typedef和#define的用法與區(qū)別
一、typedef的用法
在C/C++語言中,typedef常用來定義一個標(biāo)識符及關(guān)鍵字的別名,它是語言編譯過程的一部分,但它并不實際分配內(nèi)存空間,實例像:typedef int INT;
typedef int ARRAY[10];
typedef (int*) pINT;
typedef可以增強程序的可讀性,以及標(biāo)識符的靈活性。
二、#define的用法
#define為一宏定義語句,通常用它來定義常量(包括無參量與帶參量),以及用來實現(xiàn)那些“表面似和善、背后一長串”的宏,它本身并不在編譯過程中進行,而是在這之前(預(yù)處理過程)就已經(jīng)完成了,它的實例像:#define INT int
#define TRUE 1
#define Add(a,b) ((a)+(b));
#define Loop_10 for (int i=0; i<10; i++)
三、typedef與#define的區(qū)別
(1)#define是C語言中定義的語法,是預(yù)處理指令,在預(yù)處理時進行簡單而機械的字符串替換,不作正確性檢查,只有在編譯已被展開的源程序時才會發(fā)現(xiàn)可能的錯誤并報錯。
typedef是關(guān)鍵字,在編譯時處理,有類型檢查功能。它在自己的作用域內(nèi)給一個已經(jīng)存在的類型一個別名,但不能在一個函數(shù)定義里面使用typedef。用typedef定義數(shù)組、指針、結(jié)構(gòu)體等類型會帶來很大的方便,不僅使程序書寫簡單,也使意義明確,增強可讀性。
(2)typedef用來定義類型的別名,起到類型易于記憶的功能。另一個功能是定義機器無關(guān)的類型。如定義一個REAL的浮點類型,在目標(biāo)機器上它可以獲得最高的精度:typedef long double REAL, 在不支持long double的機器上,看起來是這樣的,typedef double REAL,在不支持double的機器上,是這樣的,typedef float REAL#define不只是可以為類型取別名,還可以定義常量、變量、編譯開關(guān)等。
(3)#define沒有作用域的限制,只要是之前預(yù)定義過的宏,在以后的程序中都可以使用,而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指向的內(nèi)容,但是p1可以指向其他內(nèi)容。
const INTPTR2 p2是一個指針常量,不可使p2再指向其他內(nèi)容。因為INTPTR2表示一個指針類型,因此用const限定,表示封鎖了這個指針類型。
INTPTR2 const p3是一個指針常量。