宏定義中##和#的作用


Author: linqo   from: linqo.cublog.cn

    內核中有很多的宏定義,在宏定義define中經常看到兩個字符串##和#,這裏把它的用法做一下說明:
    ##是一個連接符號,用於把參數連在一起
        例如:
            > #define  FOO(arg)   my##arg
        則
            > FOO(abc)
        相當於   myabc
   
    #是“字符串化”的意思。出現在宏定義中的#是把跟在後面的參數轉換成一個字符串
        例如:
            > #define STRCPY(dst, src)   strcpy(dst, #src)
        則
            > STRCPY(buff, abc)
        相當於   strcpy(buff, "abc")

    另外,如果##後的參數本身也是一個宏的話,##會阻止這個宏的展開

    #define STRCPY(a, b)    strcpy(a ## _p, #b)
    int main()
    {
        char var1_p[20];
        char var2_p[30];
        strcpy(var1_p, "aaaa");
        strcpy(var2_p, "bbbb");
        STRCPY(var1, var2);
        STRCPY(var2, var1);
        printf("var1 = %s/n", var1_p);
        printf("var2 = %s/n", var2_p);
        return 0;

        /* 注意這裏 */
        STRCPY(STRCPY(var1,var2),var2);
        /* 這裏是否會展開爲: strcpy(strcpy(var1_p,"var2")_p,"var2“)?
         * 答案是否定的:
         * 展開結果將是:  strcpy(STRCPY(var1,var2)_p,"var2")
         * ## 阻止了參數的宏展開!
         * 如果宏定義裏沒有用到 # 和 ##, 宏將會完全展開
         */
    }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章