程序以下:函數
#include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n", h(f(1,2))); printf("%s\n", g(f(1,2))); return 0; }
答案:第一行:12 第二行:f(1,2)spa
說明:code
一、關於符號#和##blog
兩個符號都只能用於預處理宏擴展。不能在普通的源碼中使用它們,只能在宏定義中使用。字符串
簡單的說,#是把宏參數變爲一個字符串,##是把兩個宏參數鏈接在一塊兒。源碼
二、關於宏展開io
預處理過程的幾個步驟:class
1)字符集轉換(如三聯字符)擴展
2)斷行連接/程序
3)註釋處理,/* comment */,被替換成空格
4)執行預處理命令,如#inlcude、#define、#pragma、#error等
5)轉義字符替換
6)相鄰字符串拼接
7)將預處理記號替換爲詞法記號
第4)步即如何展開宏函數的規則:在展開當前宏函數時,若是形參有#或##則不進行宏參數的展開,不然先展開宏參數,再展開當前宏。