程式如下:
#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.注意事項 當巨集引數是另乙個巨集的時候,...