define與typedef的區別

2022-09-06 08:57:08 字數 1963 閱讀 7734

一.#define 命令是 c 語言中的乙個巨集定義命令 ,它用來將乙個識別符號定義為乙個字串 , 該識別符號被稱為巨集名, 被定義的字串稱為替換文字。

該命令有兩種格式:一種是簡單的巨集定義, 另一種是帶引數的巨集定義。

無參巨集定義

c語言中無參巨集定義的一般形式為:#define 巨集名 字串

其中的「#」表示這是一條預處理命令。凡是以「#」開頭的均為預處理命令。「define」為巨集定義命令。「識別符號」為所定義的巨集名。「字串」可以是常數、表示式、格式串等。

例如: #define m (a+b) 它的作用是指定識別符號m來代替表示式(a+b)。在編寫源程式時,所有的(a+b)都可由m代替,而對源程式作編譯時,將先由預處理程式進行巨集代換,即用(a+b)表示式去置換所有的巨集名m,然後再進行編譯。 

程式1:

#include

#define m (a+b)

int main(void)

上例程式中首先進行巨集定義,定義m來替代表示式(a+b),在 s= m * m 中作了巨集呼叫。在預處理時經巨集展開後該語句變為: s=(a+b)*(a+b) 。但要注意的是,在巨集定義中表示式(a+b)兩邊的括號不能少。否則會發生錯誤。  如當作以下定義後:#define m (a)+(b)  在巨集展開時將得到下述語句:s= (a)+(b)*(a)+(b)。

對於巨集定義還要說明以下幾點:

1.巨集定義是用巨集名來表示乙個字串,在巨集展開時又以該字串取代巨集名,這只是一種簡單的代換,字串中可以含任何字元,可以是常數,也可以是表示式,預處理程式對它不作任何檢查。如有錯誤,只能在編譯已被巨集展開後的源程式時發現。

2.巨集定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。

3.巨集定義其作用域為巨集定義命令起到源程式結束。如要終止其作用域可使用#undef命令。

有參巨集定義

c語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數。對帶引數的巨集,在呼叫中,不僅要巨集展開,而且要用實參去代換形參。

帶參巨集定義的一般形式為:  #define 巨集名(形參表)字串

在字串中含有各個形參。 帶參巨集呼叫的一般形式為:  巨集名(形參表)

例如:#define m(y) ((y)*(y)+3*(y))/*巨集定義*/

k=m(5);/*巨集呼叫*/

在巨集呼叫時,用實參5去代替形參y,經預處理巨集展開後的語句為:  k=5*5+3*5

程式2:

#include

#define max(a,b) ((a>b)?(a):(b))

int main(int argc,char *ar**)

上例程式的第二行進行帶參巨集定義,用巨集名max表示條件表示式 (a>b)?a:b ,形參a,b均出現在條件表示式中。程式中 max=max(x,y) 為巨集呼叫,實參x,y,將代換形參a,b。巨集展開後該語句為: max=(x>y)?x:y;  用於計算x,y中的大數。

二.typedef在編譯的時候執行,用來為複雜的宣告定義簡單的別名,不能用於字串,整數等的。

1)typedef的最簡單使用

typedef long byte_4;

給已知資料型別long起個新名字,叫byte_4。

2) typedef與結構結合使用

typedef struct tagmystruct

mystruct;

通常講,typedef要比#define要好,特別是在有指標的場合。

請看例子:

typedef char* pstr1;

#define pstr2 char* 

pstr1 s1,s2;

pstr2 s3,s4;

在上述的變數定義中,s1、s2、s3都被定義為char *,而s4則定義成了char,不是我們所預期的指標變數,根本原因就在於#define只是簡單的字串替換而typedef則是為乙個型別起新名字。

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兩者...