本文摘抄自 alvin提供的筆記,在此表示感謝!
1. 執行時間不同
關鍵字 typedef 在編譯階段有效,由於是在編譯階段,因此 typedef 有型別檢查的功能。
#define 則是巨集定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字串替換,而不進行任何檢查。
【例1.1】typedef 會做相應的型別檢查:
【例1.2】#define不做型別檢查:typedef unsigned int uint;
void func()
程式的輸出結果是: 36,根本原因就在於 #define 只是簡單的字串替換。// #define用法例子:
#define f(x) x*x
int main()
2、功能有差異
typedef 用來定義型別的別名,定義與平台無關的資料型別,與 struct 的結合使用等。
#define 不只是可以為型別取別名,還可以定義常量、變數、編譯開關等。
3、作用域不同
#define 沒有作用域的限制,只要是之前預定義過的巨集,在以後的程式中都可以使用。
而 typedef 有自己的作用域。
【例3.1】沒有作用域的限制,只要是之前預定義過就可以
【例3.2】而typedef有自己的作用域void func1()
void func2()
【例3.3】void func1()
void func2()
上面例子在b類中使用uint會出錯,因為uint只在類a的作用域中。此外,在類中用typedef定義的型別別名還具有相應的訪問許可權,【例3.4】:class a};
class b
;
而給uint加上public訪問許可權後,則可編譯通過。class a};
void func3()
【例3.5】:
4、對指標的操作class a};
void func3()
二者修飾指標型別時,作用不同。
結果: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兩者...