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


程序如下:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM