C宏定義中的‘#’和‘##’

/*
#是把宏參數變爲一個字符串,##是把兩個宏參數鏈接在一塊兒。

*/

#include <stdio.h>
#define f(a,b) a##b
#define g(a)  #a
#define h(a) g(a)

int main()
{   
    f(1, 2);//宏展開: 12;
    g(3);   //宏展開: "3"

    /*
    展開宏函數的規則:
    在展開當前宏函數時,若是形參有#或##則不進行宏參數的展開,
    不然先展開宏參數,再展開當前宏。
    */
    printf("%s\n", h(f(1, 2)));//12
    printf("%s\n", g(f(1, 2)));//f(1,2) ,不進行宏參數的展開

    system("pause");
    return 0;
}

綜合以上:
第一行h(f(1,2)),因爲h(a)非#或者##因此先展開其參數f(1,2),即12,因此變成h(12),而後再宏替換爲g(12),再次替換爲12。
第二行g(f(1,2)),宏g(a)帶有#,因此裏面的f(1,2)不展開,因此變成f(1,2)ide

相關文章
相關標籤/搜索