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