c語言源程式中允許使用乙個識別符號來表示乙個字串,這稱為巨集。被定義為巨集的識別符號稱為巨集名。在編譯預處理時,對程式**現的巨集名,都用巨集定義中的字串去替換,這成為巨集替換或者巨集展開。
巨集定義時由源程式的巨集定義命令define完成的。巨集替換時由預處理程式自動完成的。在c語言中,巨集分為有引數和無引數兩 類
其中巨集名時識別符號,替換文字時任意的字串行,其中包含可以包含程式中能出現的任何字元和空格。
例如:#define left 1 #define right 0
這樣,每當在源程式中遇到left和right時,預處理程式都分別用1或者0替換。下面舉例說明:
printf
("%d%d%d\n"
,right,left,left+1)
;
執行結果如下:
這裡實際上就是用巨集定義了兩個符號常量的定義。
下面是幾個簡單的例子:
用巨集定義表示新的資料型別
#define stu struct student
此後,程式**現了:
stu x,y;經過巨集替換後,這行變成了 struct student x,y;
可以巨集定義來代表任意的語句序列或格式串等。
#define format 「%d%d%d」
則在程式中類似如
printf
("%d%d%d",1
,2,3
);//上面的語句等價於
printf
(format,1,
2,3)
;
#deine pi 3.14159
intmain()
#undef pif1(
)//巨集pi的作用域指明了是main函式,所以pi不能在f1()函式中使用
巨集pi的作用域指明了是main函式,所以pi不能在f1()函式中使用
#define hello 100
intmain()
//因為預處理命令被雙引號括起來了,所以這裡編譯器會把它當作乙個字串來處理,這裡的hello不會被100代替
因為預處理命令被雙引號括起來了,所以這裡編譯器會把它當作乙個字串來處理,這裡的hello不會被100代替
#define one1
#define two (one+one
#define three(one+two
#define six(two*three)
c語言允許巨集帶引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數。對帶引數的巨集,在呼叫中,不僅要巨集替換,而且還用實際引數去代替形式引數。
帶引數巨集的一般形式:
#define 巨集名(形式引數) 字串
例如:
#define m(x,y) x*x+3*y
/*巨集的定義*/
intmain()
再來乙個例子
#define abs(x) (x)<0?(-x):(x)
intmain()
//雖然只有乙個變數x,但是為了在做巨集替換的時候防止出錯需要用括號把變數括起來
#define abs(x) (x)<0?(-x):(x)
c 語言中的巨集定義
巨集定義 巨集定義是c提供的三種預處理功能的其中一種,這三種預處理包括 巨集定義 檔案包含 條件編譯 1.不帶引數的巨集定義 巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 格式 define 識別符號 字串 其中的識別符號就是所謂的 符號常量,也稱為 巨集名 預處理 預編譯 工作也叫做巨集展開 將巨...
C語言中的巨集定義
下列c 中包含兩種巨集定義,例如 include define max connection 1000 define mng port 5000 define min a,b a b a b define max a,b a b a b int main 方法1 gcc e 引數預編譯 gcc e ...
C語言中的巨集定義
c語言中的巨集定義 c語言中的巨集定義也叫做預處理命令,預處理命令是c語言本身的組成部分,不能直接對它們進行編譯。1.基本概念 1 預處理不是c語句,是在編譯前進行的 2 預處理功能主要用於下3種情況 巨集定義 檔案包含 條件編譯 3 巨集是在編譯前進行的,程式不能直接對它們進行編譯,由預處理程式先...