typedef和#define的用法和區別
一、typedef的用法
1、在C/C++語言中,typedef常用來定義一個識別符號及關鍵字的別名,它是語言編譯過程的一部分,但它並不實際分配記憶體空間,例項像:
typedef int INT;
typedef char* Pchar;
typedef (int*) pINT;
typedef unsigned char uchar; // 將頻繁使用且較長的型別定義一個別名
2、typedef的另外一類用法是某個型別的直接引用限制到一個地方。如:
typedef int int32;
typedef short int16;
當程式移植到一個sizeof(int)== 2的機器上時,只需要在程式碼中重新如下定義:
typedef long int32;
typedef int int16;
一定要明確的一點是:typedef只是用來定義其他型別的同義詞(或者別名),而不是一個獨立的型別。
typedef可以增強程式的可讀性,以及識別符號的靈活性,但它也有“非直觀性”等缺點。
二、#define的用法
#define為一巨集定義語句,通常用它來定義常量(包括無參量與帶參量),以及用來實現那些“表面似和善、背後一長串”的巨集,它本身並不在編
譯過程中進行,而是在這之前(預處理過程)就已經完成了,但也因此難以發現潛在的錯誤及其它程式碼維護問題,#define的用法如下:
#define INT int //用INT代替int
#define TRUE 1 //用TRUE 1
#define Add(a,b) ((a)+(b));
#define Loop_10 for (int i=0; i<10; i++)
三、兩者的區別
1、比較如下程式碼
Code 1:
typedef char* Pchar;
Pchar p1, p2;
則p1和p2都是char*型別的指標變數。
Code 2:
#define Pchar char*
Pchar p3, p4;
由於#define只是進行字串替換,因此第二句相當於 char* p3, p4;即p3是char* 型變數,而p4則是char 型變數。
2、用#define做如下巨集定義是一定注意加():
#define fun(a,b) ((a)*(b))
如果把巨集定義寫成:
#define fun(a,b) a*b
那麼,如下程式碼段得到的值跟期望值會有出入:
int x=3,y=4,z=5,k=6;
int temp = fun(x+y,z+k);
則temp = 3+4*5+6 = 29不等於期望值(3+4)*(5+6)=77