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")
* ## 阻止了參數的宏展開!
* 如果宏定義裏沒有用到 # 和 ##, 宏將會完全展開
*/
}