程序如下:
#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)
說明:
1、關於符號#和##
兩個符號都只能用於預處理宏擴展。不能在普通的源碼中使用它們,只能在宏定義中使用。
簡單的說,#是把宏參數變為一個字符串,##是把兩個宏參數連接在一起。
2、關於宏展開
預處理過程的幾個步驟:
1)字符集轉換(如三聯字符)
2)斷行鏈接/
3)注釋處理,/* comment */,被替換成空格
4)執行預處理命令,如#inlcude、#define、#pragma、#error等
5)轉義字符替換
6)相鄰字符串拼接
7)將預處理記號替換為詞法記號
第4)步即如何展開宏函數的規則:在展開當前宏函數時,如果形參有#或##則不進行宏參數的展開,否則先展開宏參數,再展開當前宏。