加载中…
个人资料
易大飞95
易大飞95
  • 博客等级:
  • 博客积分:0
  • 博客访问:3,837
  • 关注人气:1
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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
请按任意键继续. . .

以上为个人学习整理,如有错误欢迎指正,谢谢。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有