巨集定義是c提供的三種預處理功能的其中一種,這三種預處理包括:巨集定義、檔案包含、條件編譯1.不帶引數的巨集定義:
巨集定義又稱為巨集代換、巨集替換,簡稱「巨集」。
格式:#define 識別符號 字串其中的識別符號就是所謂的符號常量,也稱為「巨集名」。
預處理(預編譯)工作也叫做巨集展開:將巨集名替換為字串。
掌握"巨集
"概念的關鍵是「換」。一切以換為前提、做任何事情之前先要換,準確理解之前就要「換」。
例:#define pi 3.1415926把程式**現的pi全部換成3.
1415926
說明: (
1)巨集名一般用大寫
(2)使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:陣列大小常用巨集定義
(3)預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。
(4)巨集定義末尾不加分號;
(5)巨集定義寫在函式的花括號外邊,作用域為其後的程式,通常在檔案的最開頭。
(6)可以用#undef命令終止巨集定義的作用域
(7)巨集定義可以巢狀
(8)字串"
"中永遠不包含巨集
(9)巨集定義不分配記憶體,變數定義分配記憶體。
2.帶引數的巨集定義:
除了一般的字串替換,還要做引數代換
格式:#define 巨集名(參數列) 字串例如:
#define s(a,b) a*barea=s(3,2);第一步被換為area=a*b; ,第二步被換為area=3*2
; 類似於函式呼叫,有乙個啞實結合的過程:
(1)實參如果是表示式容易出問題
#define s(r) r*rarea=s(a+b);第一步換為area=r*r;,第二步被換為area=a+b*a+b;
正確的巨集定義是
#define s(r) (r)*(r)(
2)巨集名和引數的括號間不能有空格
(3)巨集替換只作替換,不做計算,不做表示式求解
(4)函式呼叫在編譯後程式執行時進行,並且分配記憶體。巨集替換在編譯前進行,不分配記憶體
(5)巨集的啞實結合不存在型別,也沒有型別轉換。
(6)函式只有乙個返回值,利用巨集則可以設法得到多個值
(7)巨集展開使源程式變長,函式呼叫不會
(8)巨集展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間(分配記憶體、保留現場、值傳遞、返回值)
帶引數的巨集定義
不是進行簡單的字串替換,還要進行引數替換。其定義的一般形式為 define 巨集名 參數列 字串 字串中包含在括弧中所指定的引數。如 define s a,b a b area s 3,2 定義矩形面積s,a 和 b 是邊長。在程式中用了s 3,2 把3 2分別代替巨集定義中的形式引數a b,即用 ...
巨集定義及帶引數的巨集定義
include 巨集定義,通常用於定義常量,在 轉換成二進位制檔案時會將 中的巨集名稱替換成值 define 巨集名稱 值 define a 1 帶引數的巨集 fun a,b 為巨集的名稱 a b為巨集的值 帶引數的巨集比函式效率高 define fun a,b a b 為了保證替換結果,最好加入 ...
mysql巨集引數 C語言帶引數的巨集定義
c語言允許巨集帶有引數。在巨集定義中的引數稱為 形式引數 在巨集呼叫中的引數稱為 實際引數 這點和函式有些類似。對帶引數的巨集,在展開過程中不僅要進行字串替換,還要用實參去替換形參。帶參巨集定義的一般形式為 define 巨集名 形參列表 字串 在字串中可以含有各個形參。帶參巨集呼叫的一般形式為 巨...