您的位置:首页 > 编程语言 > C语言/C++

C语言中##和#的用法

2013-05-05 00:23 337 查看
碰到一道笔试题:

读程序,写出结果


#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;


}



答:var1
= var2

var2 = var1

一直知道##是连接符号的意思,不太清楚#的用法,所以就网上搜了一下。

解释如下:

# 字符串化运算符

出现在宏定义中的#是把跟在其后的参数转换成一个字符串.

## 符号连接运算符

## 运算符用于把参数连接到一起.

这才恍然大悟,调用宏以后就是把第二个参数转换成了字符串。所以就会出现上述那个结果。

真是不错,算是补上了以前没认真学习的基础知识。又从搜到的文章往下看了一下,有高手提出了这个问题:

STRCPY(STRCPY(var1,var2),var2);

是否会展开为: strcpy(strcpy(var1_p,"var2")_p,"var2“)?

作者解答如下:

答案是否定的:

* 展开结果将是: strcpy(STRCPY(var1,var2)_p,"var2")

* ## 阻止了参数的宏展开!

* 如果宏定义里没有用到 #和 ##, 宏将会完全展开

也就是程序编译不通过,因为展开后找不到大写的STRCPY函数。

在有##和#的情况下,嵌套的宏不会完全展开。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: