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被字串化,所以...