C 语言宏定义
1、例子如下:
#define PRINT_STR(s) printf("%s",s.c_str())
string str = "abcd";
PRINT_STR(str);
结果如下:abcd
2、现在我期望打印出,str=abcd, 容易想到的解决办法是:
#define PRINT_STR(s) printf("s" "=" "%s",s.c_str())
打印出来的结果是 s=abcd,不是我们所期望的,想一下,为什么?
在这里,编译器不认为"s"中s就是前面的s,不进行替换。如果进行替换,那么"%s" 也就换成了"%str",这显然错误。
3、怎么解决上面的问题?使用另一种方式,也就是#(字符串替换,前后加上双引号),如下:
#define PRINT_STR(s) printf(#s "=" "%s",s.c_str())
可以认为,对于#s,编译器对s进行替换,并且在s前后加上双引号

4、考虑下面的情况,
int token8 = 102;
PRINT_TOKEN(8);
期望打印出 token8,容易想到的解决办法是:
#define PRINT_TOKEN(d) printf("%d",tokend)
这样是明显错误的,编译器认为tokend是一个整体,不可能只去替换d,怎么解决?
5、怎么解决这个问题?要进行替换,必须把d隔离出来,而一旦隔离出来,替换是可以了,但是不能与token合在一起构成一个变量了。
这就要使用##(宏连接符),可以认为## 进行分割,分割后替换,替换之后,再把##去除,如下:
#define PRINT_TOKEN(d) printf("%d",token##d)

6、一个# 字符串替换,两个# 宏连接符

C 语言宏定义的更多相关文章

  1. 将C语言宏定义数值转换成字符串!

    将C语言宏定义转换成字符串! 摘自:https://blog.csdn.net/happen23/article/details/50602667 2016年01月28日 19:15:47 六个九十度 ...

  2. C语言 宏定义之可变参数

    可变参数宏定义 C99编译器标准允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏.可变参数宏就像下面这个样子: #define dbgprint(. ...

  3. C语言宏定义时#(井号)和##(双井号)的用法1

    #在英语里面叫做 pound 在C语言的宏定义中,一个#表示字符串化:两个#代表concatenate 举例如下: #include <iostream> void quit_comman ...

  4. C语言宏定义时#(井号)和##(双井号)的用法

    C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结. 关于#和## 在C语言的宏中,#的功能是将其后面 ...

  5. c语言宏定义

    一. #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能理解该命令的本质,总是在此处产生一些困惑,在编程时 ...

  6. C语言宏定义相关

    写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等.下面列举一些成熟软件中常用得宏定义......1,防止一个头文件被重复包含#ifndef COMDEF_H# ...

  7. 转:C语言宏定义时#(井号)和##(双井号)的用法

    转自:http://www.cnblogs.com/welkinwalker/archive/2012/03/30/2424844.html#2678295 #在英语里面叫做 pound 在C语言的宏 ...

  8. c语言宏定义#define的理解与资料整理

    1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认 ...

  9. C程序设计语言--宏定义

    C语言中的宏定义 C语言中的宏定义也叫做预处理命令,预处理命令是C语言本身的组成部分,不能直接对它们进行编译. 1.基本概念: 1>预处理不是C语句,是在编译前进行的 2>预处理功能主要用 ...

随机推荐

  1. MySQL编码latin1转utf8

    mysql移植含有中文的数据时,很容易出现乱码问题.很多是在从mysql4.x向mysql5.x移植的时候出现.mysql的缺省字符集是 latin1,在使用mysql4.x的时候,很多人都是用的la ...

  2. iOS越狱知多少?

    著名iOS黑客团队Evad3rs上周上线了evasi0n 官网,用于展示他们破解iOS 6 和iOS 6.1  系统的进度.据官网显示,其越狱工具evasi0n已正式上线,支持iPhone.iPad等 ...

  3. tomcat server.xml maxPostSize=0 导致 果post表单收不到参数解决方案

  4. Swift - 用CATransform3DMakeRotation实现翻页效果

    Swift - 用CATransform3DMakeRotation实现翻页效果 效果 源码 https://github.com/YouXianMing/Swift-Animations // // ...

  5. UIWebView加载CSS样式的html

    UIWebView加载CSS样式的html 效果 源码 // // ViewController.m // CSS // // Created by YouXianMing on 16/7/19. / ...

  6. 如何解决SSH连接Linux超时自动断开?

    最近项目开发中用到云服务器,部署了MySQL,开发团队总是反映MySQL过一会儿就断开连接了,必须手动重连才可以.反映越来越强烈,已经到了影响开发进度的高度了,必须解决! 查了资料,这个可能和SSH超 ...

  7. 权力的游戏第七季/全集Game of Thrones迅雷下载

    艾美及金球奖获奖HBO原创剧集<权力的游戏>第七季将于2016年夏天晚些时候开拍.新的一季共有七集,主要拍摄地为北爱尔兰,部分镜头也将在西班牙和冰岛取景.上映时间预计将略有推迟,至2017 ...

  8. 详细解读LruCache类

    LruCache是android提供的一个缓存工具类,其算法是最近最少使用算法.它把最近使用的对象用“强引用”存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值达到预设定值之前就从内 ...

  9. Spring data jpa Specification查询关于日期的范围搜索

    代码: 时间格式化类型: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat s ...

  10. Restful API 的设计规范(转)

    1. URI URI 表示资源,资源一般对应服务器端领域模型中的实体类.URI规范 不用大写; 用中杠-而不用下杠_; 参数列表要encode; URI中的名词表示资源集合,使用复数形式; 资源集合与 ...