Typedef和define的區別

2021-04-20 05:33:54 字數 1226 閱讀 3132

typedef和define都可以用來給物件取乙個別名,但是兩者卻有著很大不同。

1. 首先,二者執行時間不同

關鍵字typedef在編譯階段有效,由於是在編譯階段,因此typedef有型別檢查的功能。

define則是巨集定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字串替換,而不進行任何檢查。

#define用法例子:

#define f(x) x*x

main( )

程式的輸出結果是: 36,根本原因就在於#define只是簡單的字串替換。

2. 功能不同

typedef用來定義型別的別名,這些型別不只包含內部型別(int,char等),還包括自定義型別(如struct),可以起到使型別易於記憶的功能。

如: typedef int (*pf) (const char *, const char *);

定義乙個指向函式的指標的資料型別pf,其中函式返回值為int,引數為const char *。

typedef 有另外乙個重要的用途,那就是定義機器無關的型別,例如,你可以定義乙個叫 real 的浮點型別,在目標機器上它可以i獲得最高的精度:typedef long double real;

在不支援 long double 的機器上,該 typedef 看起來會是下面這樣:typedef double real;

並且,在連 double 都不支援的機器上,該 typedef 看起來會是這樣:typedef float real;

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

3. 作用域不同

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

而typedef有自己的作用域。

void   fun()  

void   gun()  

4. 對指標的操作

二者修飾指標型別時,作用不同。

typedef int * pint;

#define pint int *

const pint p;//p不可更改,p指向的內容可以更改,相當於 int * const p;

const pint p;//p可以更改,p指向的內容不能更改,相當於 const int *p;或 int const *p;

pint s1, s2; //s1和s2都是int型指標

pint s3, s4; //相當於int * s3,s4;只有乙個是指標。

typedef和 define的區別

一 typedef的用法 二 define的用法 define為一巨集定義語句,通常用它來定義常量 包括無參量與帶參量 以及用來實現那些 表面似和善 背後一長串 的巨集,它本身並不在編 譯過程中進行,而是在這之前 預處理過程 就已經完成了,但也因此難以發現潛在的錯誤及其它 維護問題,define的用...

typedef和define的區別

define char string string filename 這段 是可以工作的那麼為什麼還要多個typedef呢?請看下面 利用上面的 如果這樣寫 string file1,file2 經過替換,變成 char file1,file2 雖然在編譯上不錯但是含義卻錯了,裡面的 file1是指...

typedef和 define的區別

typedef和 define的區別 使用巨集定義的重新命名常量的好處 程式易讀性強 便於維護和修改 1 define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。例如 define pi 3.141592...