c 語言中巨集引數的字串化跟巨集引數的連線

2021-09-29 14:34:11 字數 1082 閱讀 7946

c語言中的巨集有無引數的巨集,也有帶引數的巨集。

其實巨集就相當與乙個字串模板,然後預處理器在有巨集的標誌處,把巨集展開,說明白點,也就是字串的替換工作。不過這個工作發生在編譯之前,以前一直不理解,感覺c語言中的巨集有多高大上,原來只是對你的c**進行一些字串的替換工作,替換後,還是c語言,然後才開始編譯成彙編等指令。

現在說說如何定義乙個有引數的巨集,比如最簡單的巨集定義

#define max(a,b) (a)>(b)?(a):(b)
這樣,當我們在**中遇見max()的標誌時候,預編譯處理器(注意不是編譯器)會自動替換這個模板,然後展開就相當與比較兩個數字的大小;

如下所示:

int

getmax

(int x,

int y)

表面上看起來引用了乙個巨集,其實經過預處理器進行字串的替換工作,然後就變成這樣了:

int

getmax

(int x,

int y)

看到了沒有,巨集只是替換字串,再簡單不過了,就是不知道為什麼其他語言沒有巨集這個概念。

明白了巨集的概念,那麼。我們進對巨集的引數做兩個操作,巨集引數字串化,巨集引數的連線。

1.紅引數的字串化,如下:

#define str(a) #a
通過#這個字元,就可以把巨集裡面的引數 a給變成字串,舉例如下

cout <<

str(hello everyone!

)<< endl;

這樣,就可以列印出 hello everyone!這個字串!

2.巨集引數的簡單連線。

#define join(a,b) a##b
這樣就簡單 的把 a,b兩個變數的內容做了乙個字串的拼接操作,如下**會輸出1234.

cout <<

join(12

,34)<< endl;

注意,只是簡單的字串連線。沒有任何加減乘除的操作。

C語言巨集引數的字串化和巨集引數的連線

在巨集定義中,有時還會用到 和 兩個符號,它們能夠對巨集引數進行操作。用來將巨集引數轉換為字串,也就是在巨集引數的開頭和末尾新增引號。例如有如下巨集定義 define str s s那麼 printf s str c.biancheng.net printf s str c.biancheng.ne...

C語言中的帶引數巨集

c語言中的帶引數巨集 一.帶引數的巨集 1.帶引數的巨集定義不是簡單的字串替換,還要進行引數替換 定義格式為 define 巨集名 參數列 字串 1 字串包含括號中所有指定的引數 eg define s a,b a b area s 3,2 2 編譯系統處理帶引數的巨集名時,按程式行中指定的字串,括...

兩級巨集 字串化巨集

如果你想字串化巨集引數擴充套件的結果,你必須使用兩個級別的巨集。1 define xstr s str s 2 define str s s 3 define foo 4 4str foo 5 foo 6xstr foo 7 xstr 4 8 str 4 9 4 當s被用在str中,s被字串化,所以...