赞
踩
# :把宏参数变为一个字符串,
##:把两个宏参数贴合在一起.
#include<stdio.h>
#define toString(str) #str //转字符串
#define conStr(a,b) (a##b)//连接
int main()
{
printf(toString(12345)): //输出字符串"12345
printf("\n%d\n",conStr(1, 3)); //输出int 13
return 0;
}
当一个宏的传入参数是另一个宏的时候,需要注意的是凡宏定义里有用#或##的地方,作为参数的那个宏是不会再展开的,即,只有当前宏生效, 参数里的宏!不!会!生!效!!!!
#include<stdio.h>
#define toString(str) #str //转字符串
#define conStr(a,b) (a##b)//连接
#define AGE 18
int main(void)
{
printf("str is:%s", toString(AGE)); //输出字符串“AGE”而不是18
//printf("\n%s",conStr(AGE,AGE)); //语法错误 --- AGEAGE未申明的标识符
return 0;
}
两句print会被展开为:
printf("str is:%s", "AGE");
printf("\n%s",AGEAGE);
分析:
由于AGE是宏,且作为宏toString和conStr的参数,并且宏conStr和toString中均含有#或者##符号,所以AGE不能被再次展开。导致不符合预期的情况出现。
解决这个问题的方法很简单,多加一层中间转换宏。
加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里就会先得到宏参数的值,然后再传递给后续的宏
#include<stdio.h>
#define _toString(str) #str //转字符串
#define toString(str) _toString(str)
#define _conStr(a,b) (a##b)//连接
#define conStr(a,b) _conStr(a,b)
#define AGE 18
结果:
printf('str is:%s', toString(AGE))
//输出为: str is: 18
//toString(AGE) -> _toString(18) ->"18”
printf("n%d",conStr(AGE, AGE));
//输出为1818
//conStr(AGE,AGE) -> conStr(18,18) ->1818
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。