typedef
- 一種在計(jì)算機(jī)編程中用來(lái)聲明自定義數(shù)據(jù)類型,配合各種原有數(shù)據(jù)類型達(dá)到簡(jiǎn)化編程目的的類型定義關(guān)鍵字
- typedef 是 C 語(yǔ)言語(yǔ)句, 其功能是用戶為已有數(shù)據(jù)類型取別名
For Example
typedef int INTEGER;
INTEGER a,b; // 以后就可用INTEGER來(lái)代替int作整型變量的類型
用typedef定義數(shù)組、指針蜓竹、結(jié)構(gòu)等類型將帶來(lái)很大的方便,不僅使程序書寫簡(jiǎn)單而且使意義更為明確吓妆,因而增強(qiáng)了可讀性。例如:
typedef int a[10];//表示a是整型數(shù)組類型吨铸,數(shù)組長(zhǎng)度為10行拢。
a s1,s2;//完全等效于:int s1[10],s2[10] ;
同理 typedef void (*p)(void) 表示p是一種指向void型的指針類型!
#define
- 預(yù)處理指令
For Example
#define int INTEGER
表示在源程序中的所在int將會(huì)被 INTEGER 原樣代替. 程序中有int a,b ;則在編譯前將被替換為INTEGER a,b;
區(qū)別
#define 是 C 中定義的語(yǔ)法, typedef 是 C++ 中定義的語(yǔ)法, 二者在 C++ 中可以通用, 但 #define 成了預(yù)編譯指令, typedef 當(dāng)成語(yǔ)句處理. typedef 和 define 都可以用來(lái)給對(duì)象取一個(gè)別名, 但是倆者卻有很大的不同, 有以下幾點(diǎn)
- 執(zhí)行時(shí)間不同
- 關(guān)鍵字 typedef 在編譯階段有效, 猶豫是在編譯階段, 因此 typededf 有類型檢查的功能.
- define 是宏定義, 發(fā)生在預(yù)處理階段, 也就是編譯之前, 它只是進(jìn)行簡(jiǎn)單而機(jī)械的字符串替換, 而不進(jìn)行任何檢查.
程序的輸出結(jié)果是: 36握巢,根本原因就在于#define只是簡(jiǎn)單的字符串替換晕鹊,應(yīng)當(dāng)加個(gè)括號(hào)“(X*X)”。#define f(x) x*x ---------------- int a=6诞吱,b=2舟奠,c; c=f(a) / f(b)狐胎; printf("%d \n"鸭栖,c);
- 功能不同
typedef-
typedef 用來(lái)定義類型的別名, 這些類型不止包含內(nèi)部類型 ( init, char 等), 還包括自定義類型 (如 struct), 可以起到使類型易于記憶的功能. 如
typedef int (*PF) (const char *, const char *);
定義一個(gè)指向函數(shù)的指針的數(shù)據(jù)類型PF暴浦,其中函數(shù)返回值為int溅话,參數(shù)為const char *. 這個(gè)就和定義 Block 很像了
-
typedef 有另外一個(gè)重要的用途,那就是定義機(jī)器無(wú)關(guān)的類型歌焦,例如飞几,你可以定義一個(gè)叫 REAL 的浮點(diǎn)類型,在目標(biāo)機(jī)器上它可以i獲得最高的精度:
typedef long double REAL;
在不支持 long double 的機(jī)器上独撇,該 typedef 看起來(lái)會(huì)是下面這樣:
typedef double REAL;
并且屑墨,在連 double 都不支持的機(jī)器上,該 typedef 看起來(lái)會(huì)是這樣:
typedef float REAL;
- 不止可以為類型取別名, 還可以定義常量, 變量, 編譯開關(guān)等.
-
- 作用域不同
#define 沒(méi)有作用域的限制, 只要是之前預(yù)定義過(guò)的宏, 在以后的程序中都可以使用. 而 typedef 有自己的作用域.void fun() { #define A int } void gun() { //在這里也可以使用A纷铣,因?yàn)楹晏鎿Q沒(méi)有作用域卵史, //但如果上面用的是typedef,那這里就不能用A 搜立,不過(guò)一般不在函數(shù)內(nèi)使用typedef }
- 對(duì)指針的操作
二者修飾指針類型時(shí), 作用不同Typedef int * pint以躯; #define PINT int * Const pint p;//p不可更改啄踊,p指向的內(nèi)容可以更改忧设,相當(dāng)于 int * const p; Const PINT p;//p可以更改颠通,p指向的內(nèi)容不能更改址晕,相當(dāng)于 const int *p;或 int const *p蒜哀; pint s1, s2; //s1和s2都是int型指針 PINT s3, s4; //相當(dāng)于int * s3斩箫,s4吏砂;只有一個(gè)是指針。
倆點(diǎn)關(guān)鍵區(qū)別
- ① typefdef 是一種徹底的"封裝"類型, 聲明他以后就不能再往里面添加別的東西. (換個(gè)說(shuō)法, typedef 是一個(gè)完整的獨(dú)立的類型, 并且和其他類型說(shuō)明符不能同時(shí)使用)
- ② 在連續(xù)定義幾個(gè)變量的時(shí)候, typedef 可以保證所有變量都是同一個(gè)類型, 但是 #define 就不一定保持