巨集定義基本用法

2021-08-11 20:47:32 字數 2135 閱讀 9111

巨集定義又稱為巨集代換、巨集替換,簡稱「巨集」。

格式:

#define 識別符號 字串
其中的識別符號就是所謂的符號常量,也稱為「巨集名」。

預處理(預編譯)工作也叫做巨集展開:將巨集名替換為字串。

掌握」巨集」概念的關鍵是「換」。一切以換為前提、做任何事情之前先要換,準確理解之前就要「換」。

例:

#define pi 3.1415926
把程式中出現的pi全部換成3.1415926

巨集名之後帶括號的巨集被認為是巨集函式。用法和普通函式一樣,只不過在預處理階段,巨集函式會被展開。優點是沒有普通函式儲存暫存器和引數傳遞的開銷,展開後的**有利於cpu cache的利用和指令**,速度快。缺點是可執行**體積大。

和不帶引數的巨集定義一樣,除了一般的字串替換,還要做引數代換。

格式:

#define 《巨集名》 (《參數列》) 《巨集體》
例如:

#define s(a,b) a*b
area=s(3,2);第一步被換為area=a * b; ,第二步被換為area=3 * 2;

例如:

#define s(r) r*r
area=s(a+b);第一步換為area=r * r;,第二步被換為area=a+b * a+b;

正確的巨集定義是#define s(r) ((r)*(r))

例如:

#define min(a, b)   a < b ? a : b

int a = 2 * min(3, 4);

printf("%d", a);

展開結果:

int a = 2 * min(3, 4);

//=> int a = 2 * 3 < 4 ? 3 : 4;

//=> int a = 6 < 4 ? 3 : 4;

//=> int a = 4;

正確如下:

#define max(a,b) ((a)>(b)?(a):(b))
則遇到max(1+2,value)則會把它替換成:

((1+2)>(value)?(1+2):(value))

需要注意的是凡巨集定義裡有用』#』或』##』的地方巨集引數是不會再展開,被當做字串處理

#define str(str) #str
「#」號用於把巨集定義中的引數兩端加上字串的」「

比如,這裡str(my#name)會被替換成」my#name」

例如:

#define wide(str) l##str
則會將形參str的前面加上l

比如:wide(「abc」)就會被替換成l」abc」

如果有:

#define fun(a,b) vo##a##b()
那麼fun(id ma,in)會被替換成void main()

每一次換行都必須要有 「 \ 」結尾,末尾行不需要「 \ 」 結尾。

例如:

#define doit(m,n) for(int i=0;i<(n);++i)\

#define warn_if(exp) \

do \

while (0)

warn_if (x == 0);會被擴充套件成:

do 

while (0);

#define var_to_str(var)\

(\else\

\(name);\

})

std::string str = var_to_str(vdad::rrr) 展開後:

int main()

else

(name);

});cout << ss<< endl;

return

0;}

輸出為:

1.c語言巨集的特殊用法和幾個坑

2.c/c++ 巨集定義

巨集定義 號用法

define s x 自動給引數x轉換為 x 轉換為字串 這裡的語言符號不一定是巨集的變數 include define s x system x void main c語言中 被稱為連線符 它是一種預處理運算子,用來把兩個語言符號 token 組合成單個語言符號 這裡的語言符號不一定是巨集的變數。...

巨集定義的用法

有五種用法,含有引數和不含引數,行尾都不用加分號 define 識別符號 替換列表 類似於全域性變數了 如果其他檔案沒有包含定義巨集的檔案,則在巨集定義的位置結束,如果有包含,則到包含的檔案結束 define largest num 1000 define 識別符號 引數列表 替換列表 注意,替換列...

巨集定義基本使用

參照c語言的預處理命令簡介 define 定義乙個預處理巨集 undef 取消巨集的定義 include 包含檔案命令 include next 與 include相似,但它有著特殊的用途 if 編譯預處理中的條件命令,相當於c語法中的if語句 ifdef 判斷某個巨集是否被定義,若已定義,執行隨後...