碰到一道笔试题:
读程序,写出结果
#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 ", var1_p);
printf("var2 = %s ", var2_p);
return 0;
}
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 ", var1_p);
printf("var2 = %s ", var2_p);
return 0;
}
答:var1 = var2
var2 = var1
一直知道##是连接符号的意思,不太清楚#的用法,所以就网上搜了一下。
解释如下:
# 字符串化运算符
出现在宏定义中的#是把跟在其后的参数转换成一个字符串.
## 符号连接运算符
## 运算符用于把参数连接到一起.
这才恍然大悟,调用宏以后就是把第二个参数转换成了字符串。所以就会出现上述那个结果。
真是不错,算是补上了以前没认真学习的基础知识。又从搜到的文章往下看了一下,有高手提出了这个问题:
STRCPY(STRCPY(var1,var2),var2);
是否会展开为: strcpy(strcpy(var1_p,"var2")_p,"var2“)?
作者解答如下:
答案是否定的:
* 展开结果将是: strcpy(STRCPY(var1,var2)_p,"var2")
* ## 阻止了参数的宏展开!
* 如果宏定义里没有用到 #和 ##, 宏将会完全展开
也就是程序编译不通过,因为展开后找不到大写的STRCPY函数。
在有##和#的情况下,嵌套的宏不会完全展开。