typedef 與 define 的區別

2021-09-09 06:22:43 字數 2010 閱讀 8881

本文摘抄自  alvin提供的筆記,在此表示感謝!

1. 執行時間不同

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

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

【例1.1】typedef 會做相應的型別檢查:

typedef unsigned int uint;

void func()

【例1.2】#define不做型別檢查:

// #define用法例子:

#define f(x) x*x

int main()

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

2、功能有差異

typedef 用來定義型別的別名,定義與平台無關的資料型別,與 struct 的結合使用等。

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

3、作用域不同

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

而 typedef 有自己的作用域。

【例3.1】沒有作用域的限制,只要是之前預定義過就可以

void func1()

void func2()

【例3.2】而typedef有自己的作用域

void func1()

void func2()

【例3.3】

class a}; 

class b

;

上面例子在b類中使用uint會出錯,因為uint只在類a的作用域中。此外,在類中用typedef定義的型別別名還具有相應的訪問許可權,【例3.4】:

class a}; 

void func3()

而給uint加上public訪問許可權後,則可編譯通過。

【例3.5】:

class a}; 

void func3()

4、對指標的操作

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

typedef int * pint;

#define pint int *

int i1 = 1, i2 = 2;

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

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

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

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

void testpointer()

結果:

p1:00efd094  *p1:1

p1:00efd094 *p1:5

p2:00efd098 *p2:2

p2:00efd094 *p2:5

typedef與 define 的區別

一 typedef的用法 typedef常用來定義乙個識別符號及關鍵字的別名,它是語言編譯過程的一部分,但它並不實際分配記憶體空間,例項像 typedef int int typedef int array 10 typedef int pint typedef可以增強程式的可讀性,以及識別符號的靈...

typedef與 define 的區別

typedef與 define 的區別 一 typedef的用法 typedef常用來定義乙個識別符號及關鍵字的別名,它是語言編譯過程的一部分,但它並不實際分配記憶體空間,例項像 typedef int int typedef int array 10 typedef int pint typede...

typedef與 define的區別

typedef與 define的區別 從以上的概念便也能基本清楚,typedef只是為了增加可讀性而為識別符號另起的新名稱 僅僅只是個別名 而 define 原本在c中是為了定義常量,到了c const enum inline的出現使它也漸漸成為了起別名的工具。有時很容易搞不清楚與typedef兩者...