本文主要讲述c语言中#和##的用法
\#的作用----字符串化操作符
将宏定义中的传入参数名转换成一对双引号括起来参数名字符串,其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。
注:
- 将右边的参数做整体的字符串替换。
- 对于\#的参数,即便是另一个宏,也不展开,仍然作为字符串字面信息输出。
#include<stdio.h>
#define dprint(expr) printf(#expr"=%d\n",expr);
int main()
{
int a=20,b=10;
dprint(a/b);
return 0;
}
/*
输出:a/b=2
*/
\#\#的作用----符号连接操作符
作用:将宏定义的多个形参转换成一个实际参数名。
- 当\#\#连接形参时,\#\#前后的空格可有可无。
- 将左右两边的参数做整体的字符串拼接替换。
- 同#,对于##的参数,即便是另一个宏,也不展开,仍然作为字符串字面信息输出。
- 经过##替换后的内容必须能够作为一个合法的变量。
#define f(a,b) a##b
则
f(1,2) 替换拼接成12
f(i,1) 替换拼接称i1
以上f(i,1) 中,如果程序中没有i1的定义,则即便是通过了宏替换,也不能编译通过。
#include <stdio.h>
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
{
int a2=3;
//printf("%s\n",f(a,2));错误,没有a2的字符串变量
printf("%d\n",f(a,2));//正确
printf("%s\n", h(f(1,2)));
printf("%s\n", g(f(1,2)));
return 0;
}
/*输出
3
12
f(1,2)
*/
评论 (0)