巨集定義中 和 符號的使用和巨集定義展開問題

2022-07-05 08:15:10 字數 609 閱讀 6045

程式如下:

#include #define f(a,b) a##b

#define g(a) #a

#define h(a) g(a)

intmain()

答案:第一行:12  第二行:f(1,2)

說明:1、關於符號#和##

兩個符號都只能用於預處理巨集擴充套件。不能在普通的原始碼中使用它們,只能在巨集定義中使用。

簡單的說,#是把巨集引數變為乙個字串,##是把兩個巨集引數連線在一起

2、關於巨集展開

預處理過程的幾個步驟:

1)字符集轉換(如三聯字元)

3)注釋處理,/* comment */,被替換成空格

4)執行預處理命令,如#inlcude、#define、#pragma、#error等

5)轉義字元替換

6)相鄰字串拼接

7)將預處理記號替換為詞法記號

第4)步即如何展開巨集函式的規則:在展開當前巨集函式時,如果形參有#或##則不進行巨集引數的展開,否則先展開巨集引數,再展開當前巨集。

巨集定義的符號

在預處理階段就展開了 define巨集定義中的 及 符號 1 stringizing 字串化操作符。其作用是 將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。其只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。如 define example instr printf t...

巨集定義中 和 的區別

1 構串操作符 將右邊的巨集引數做整體的字串替換。define string x x x define text x a x a int main text test 巨集展開 a test a 構造字串 a test a atesta string test 巨集展開 test test 構造字串...

巨集定義中 和 的用法

1.前言 使用 把巨集引數變為乙個字串,用 把兩個巨集引數貼合在一起.2.一般用法 include include using namespace std define str s s define cons a,b int a e b int main 3.注意事項 當巨集引數是另乙個巨集的時候,...