您的位置:首页 > 其它

宏定义中##和#的作用

2009-01-09 15:11 274 查看
[/b]
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")
* ## 阻止了参数的宏展开!
* 如果宏定义里没有用到 # 和 ##, 宏将会完全展开
*/
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: