C語言中typedef與define有些功能有點類似,比如它們均可以給一個對象取個別名。因此也讓許多初學者產生迷惑,分不清楚到底有什麼區別,今天作者來總結一下供大家參考,看了本文相信大家能夠掌握。
1、 從功能上來說有不同
define指令用於宏定義,可以提高原始碼的可讀性,為編程提供方便,一般放在源文件的前面部分。
typedef用來定義自己習慣使用的數據類型名稱,可以替代自己所熟悉的基本類型、數組類型、指針類型以及自己定義的結構體類型、共用體類型、枚舉類型等。一旦我們在程序中使用typedef定義了自己的數據類型名稱,我們就可以像使用int、float和double等基本數據類型一樣來使用它。
2、 從處理時機來說有不同
define是預處理指令,並不是編譯過程中處理,而是在編譯之前就已經完成了。它只是簡單而機械的字符串替換,並不做正確性檢測,若有錯誤,只能在編譯這些已經展開的源程序時才能夠被發現並報錯。
typedef所定義的新名字具有一定的封裝性,是在程序編譯階段處理的,編譯時有類型檢測功能。但它並不實際分配內存空間。
3、 從具體用法來說有不同
define用於定義常量、變量、編譯開關等。詳細用法請見作者的另一篇文章,名為「C語言中的define預處理指令老手都是這樣用,你全都掌握了嗎?」,本文不再贅述。
typedef用於為不同數據類型定義新名字,詳細用法請見作者的另一篇文章,名為「C語言中typedef用法總結,看完就能像編程老手一樣熟練運用」,本文不再贅述。
4、從對指針的操作來說有不同
define和typedef兩者都可以定義指針類型,但使用定義後的類型名去定義變量時,結果有差異。定義如下:
#define PCHAR1 char*
typedef char* PCHAR2;
(1) 指針差異1,直接定義變量
舉例說明如下:
PCHAR1 pc1, pc2;
PCHAR2 pc3, pc4;
上面兩行語句目的是想把pc1、pc2、pc3、pc4都定義成指向char型數據的指針,結果pc2不符合定義成指針的預期,其實際為char型普通變量,其它三個為指針變量,符合預期。
為什麼導致這個結果呢?原因很簡單,define就是一個宏定義,在編譯預處理階段直接字符串替換,直接將PCHAR1替換成char*,替換後變成如下形式:
char * pc1, pc2;
很顯然,pc1是指針變量,pc2為普通變量。
(2) 指針差異2,與const修飾符連用。
舉例說明如下:
char c1=『A』;
char c2=『B』;
char c3=『C』;
const PCHAR1 pc5; //語句1
const PCHAR2 pc6=&c2; //語句2
語句1中,const限定的是指針變量pc5所指向空間的值,即空間的值不可被更改;但指針變量pc5的值可以更改,即其可以指向其它空間。
語句2中,const限定的是指針變量pc6的值,即pc6的值不可更改;但其所指向空間的值是可以更改的。通常在語句2中需要給pc6賦初值,否則編譯時會有警告,提示所使用的pc6未初始化。
導致此差異的原因依然是define只是簡單的字符串替換,語句1實際上是如下形式:
const char * pc5; //語句1
如果按照語句2形式的定義,想要用const限定空間的值,而不是限定指針,只需要重新定義PCHAR2即可,定義可修改為如下形式:
typedef const char* PCHAR2;
關於typedef與define的用法區別今天就總結到這,如果大家有任何疑問請留言探討。我是「C語言知識傳播者」,志在瞄準C語言,挖掘和總結C語言的難點和痛點,給C語言編程愛好者和本領域從業人員提供參考,我會用心總結C語言知識的點點滴滴,你的關注是我持續創作的動力,請關注我,收藏本文、轉發並點讚,希望得到你們的持續關注,謝謝!