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函数。
在有##和#的情况下,嵌套的宏不会完全展开。
读程序,写出结果
#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函数。
在有##和#的情况下,嵌套的宏不会完全展开。
相关文章推荐
- C语言中##和#的用法
- C语言中#和##的用法
- C语言中##的用法以及##在变参的设计
- C语言宏定义中#与##的用法
- C语言宏中#和##的用法 -- 2010.10.30高通笔试
- C语言中#和##的用法
- C语言中的#跟##用法
- c语言中#和##的用法
- C语言中#和##的用法
- c语言define中##用法---ffmpeg
- C语言中#和##的用法
- C语言:宏定义的#和##用法
- c语言中的#与##的用法简介
- C语言中如何使用宏连接多个字符串(#和##的用法)
- C++基础:C语言中##的用法
- c语言#和## 的用法
- C语言中##的用法
- C语言循环结构与时间函数用法实例教程
- C语言中 malloc函数用法
- 每日一讲:C语言getchar函数的用法