C++中单个#和两个##的含义
(2017-03-29 13:23:05)
标签:
c |
分类: C/Cplusplus |
在最近的编程中突然又要遇到#和##号的使用,虽然之前学过,但是现在都已经忘记,最近又重新学习了一下,下面是我做的简单的笔记。
在进行C/C++开发中,进行宏定义时,我们经常会遇到#和##的使用,有时候因为不清楚它的
具体使用方法,导致对程序的不甚理解。
1. #号的含义
一个#号表示:把对应变量字符串化,就是把#号后面的变量转换成字符串。、
比如:
#define STR(s) #s
//表示把s转换成字符串,无论s是什么类型
我们看一下代码:
#include “iostream”
#define STR(s) #s
int main()
{
fprintf(stderr, STR(s=10) "\n");
return 0;
}
运行结果:
s = 10
请按任意键继续. . .
也就是说STR()的括号里无论你输入什么,他都会转换成字符串,然后原样输出输入输入的信息。
我们再来看一个代码:
#include
#define MACRO(EXP) \
if (!(EXP)) \
fprintf(stderr, "Error Msg: " #EXP "\n"); \
else \
fprintf(stderr, "Msg: " #EXP "\n");
int main()
{
MACRO(0);
MACRO(1+1);
return 0;
}
运行结果:
Error Msg: 0
Msg: 1+1
请按任意键继续. . .
从这段代码中我们可以if-else写成宏的形式使用,因为这样的化他只和编译有关。
2. ##的含义
两个##号表示:连接符,把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符。
比如:
#define STR(s) (a##s);
//就是把字符a和传入参数s合并到一起,成为一个,
比如我们传入1给参数s,那么这行这一句候的(a##s)就变成了a1。
我们举一个例子来说明吧:
#include
#define STR(s) (a##s)
int main()
{
int a1 = 10;
printf("%d\n", STR(1));
return 0;
}
运行结果:
10
请按任意键继续. . .
它就是在printf函数中,把STR(1)中的参数1传入到宏中,使(a##s)就变成了a1,我们在程序中定义了a1=1;所以printf函数就会输出a1的结果。
我们再举一个例子,深入了解学习两个##号的含义。
#include
#define trace(data, format) fprintf(stderr, #data "=%" #format
"\n", data)
#define trace2(data) trace(i##data, d)//这里的d就是%d中的d
#define trace3(data) trace(d##data, lf)//这里的lf就是%lf中的lf
#define trace4(data) trace(c##data, c)//这里c就是%c中的c
int main()
{
int i1=2;
double d1 = 3.14;
char c1 = 'A';
trace(i1, d); //等价与fprintf(stderr, "i1=%d\n", i1);
trace(d1, lf); //等价与fprintf(stderr, "d1=%lf\n", d1);
trace(c1, c); //等价与fprintf(stderr, "c1=%c\n", c1);
trace2(1); //首先转换为trace(i1, 1); 然后转化内fprintf(stderr,
"i1=%d\n", i1);
trace3(1); //首先转换为trace(d1, 1); 然后转化内fprintf(stderr,
"d1=%lf\n", d1);
trace4(1); //首先转换为trace(c1, 1); 然后转化内fprintf(stderr,
"c1=%c\n", c1);
return 0;
}
运行结果:
i1=2
d1=3.140000
c1=A
i1=2
d1=3.140000
c1=A
请按任意键继续. . .
以上为个人学习整理,如有错误欢迎指正,谢谢。