像函式的巨集
◆ define cube(x) ((x)*(x)*(x))
◆ 巨集可以帶引數
【例】
在這個巨集中,編譯預處理時,會將所有的cube(x)替換成((x)*(x)*(x)),其中x是引數#include#define cube(x) ((x)*(x)*(x))
int main(int argc, char const* ar**)
錯誤定義的巨集
【例】#define radtodeg(x) (x * 57.29578)
#define radtodeg(x) (x) * 57.29578
如下圖所示,編譯執行後所得到的結果與我們人工計算的截然不同:#include#define radtodeg1(x) (x * 57.29578)
#define radtodeg2(x) (x) * 57.29578
int main(int argc, char const* ar**)
實際上,在預處理後,所得到的的**格局是:
帶引數巨集的原則◆ 一切都要括號#include#define radtodeg1(x) (x * 57.29578)
#define radtodeg2(x) (x) * 57.29578
int main(int argc, char const* ar**)
★ 整個值要括號 → 紅色
★ 引數出現的每個地方都要括號 → 藍色
◆ #define radtodeg(x) (
(x)* 57.29578) → 正確的寫法
帶引數的巨集
◆ 可以帶多個引數
★ #define min(a, b) ((a) > (b) ? (b) : (a)) //外圍有括號,裡面所有的引數都要有括號
◆ 也可以組合(巢狀)使用其他巨集
分號?
【例】如上所示的**是錯誤的,因為在巨集後面多寫了乙個分號;
上述**實際上展開就變成了:#include#define pretty_print(msg) printf(msg);
int main(int argc, char const* ar**)
因此,在巨集的使用中,每一行的末尾絕對不要加上分號「;」,因為這不是c的語句#includeint main(int argc, char const* ar**)
帶引數的巨集(2)
◆ 在大型程式的**中使用非常普遍
◆ 可以非常複雜,如「產生」函式
★ 在#和##這兩個運算子的幫助下
◆ 存在中西方文化差異
◆ 部分巨集會被inline函式替代
其他編譯預處理指令
◆ 條件編譯
◆ error
C語言的巨集之帶引數巨集
c語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數,這種巨集外形和作用與函式類似,即類函式巨集。但是它的行為和函式呼叫完全不同。對帶引數的巨集,在呼叫中,不僅要巨集展開,而且要用實參去代換形參。類函式巨集定義的圓括號中可以有乙個或多個引數,隨後這些引數出現在替換體...
mysql巨集引數 C語言帶引數的巨集定義
c語言允許巨集帶有引數。在巨集定義中的引數稱為 形式引數 在巨集呼叫中的引數稱為 實際引數 這點和函式有些類似。對帶引數的巨集,在展開過程中不僅要進行字串替換,還要用實參去替換形參。帶參巨集定義的一般形式為 define 巨集名 形參列表 字串 在字串中可以含有各個形參。帶參巨集呼叫的一般形式為 巨...
C語言中的帶引數巨集
c語言中的帶引數巨集 一.帶引數的巨集 1.帶引數的巨集定義不是簡單的字串替換,還要進行引數替換 定義格式為 define 巨集名 參數列 字串 1 字串包含括號中所有指定的引數 eg define s a,b a b area s 3,2 2 編譯系統處理帶引數的巨集名時,按程式行中指定的字串,括...