宏定義中#和##符號的使用和宏定義展開問題

程序以下:函數

#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)步即如何展開宏函數的規則:在展開當前宏函數時,若是形參有#或##則不進行宏參數的展開,不然先展開宏參數,再展開當前宏。

相關文章
相關標籤/搜索