C語言基礎之帶引數的巨集

2021-10-09 14:09:42 字數 1718 閱讀 3825

像函式的巨集

◆ define cube(x) ((x)*(x)*(x))

◆ 巨集可以帶引數

【例】

#include#define cube(x) ((x)*(x)*(x))

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

在這個巨集中,編譯預處理時,會將所有的cube(x)替換成((x)*(x)*(x)),其中x是引數

錯誤定義的巨集

#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**)

上述**實際上展開就變成了:

#includeint main(int argc, char const* ar**)

因此,在巨集的使用中,每一行的末尾絕對不要加上分號「;」,因為這不是c的語句

帶引數的巨集(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 編譯系統處理帶引數的巨集名時,按程式行中指定的字串,括...