打印宏
来源:互联网 发布:车票软件下载 编辑:程序博客网 时间:2024/05/29 09:39
如何打印宏
- 如何打印宏
- 问题描述
- 分析思路
- 总结
1. 问题描述
我们都知道,在C/C++中经常会用到宏定义,宏实际上就是给一个字段取的一个别名,它是属于预编译系统的一部分,其形式如:
#define PI 3.141592654
当我们想要使用3.141592654
这个值的时候,直接用它的别名PI
就可以了。如果什么时候,我们需要将PI
的精度提高,则只需要修改这个宏定义就可以了,而不用一个一个的去修改。
同时,宏是没有类型的,在预编译时,系统对它只是完全的字符替换而已,例如:
#define SQR(x) x*xint main(){int a=SQR(5+3);printf("the result is:%d",a);return 0;}
在预编译后,代码相当于:
int main(){int a=5+3*5+3;printf("the result is:%d\n",a);return 0;}
结果是:the result is:23
因为宏是没有类型的,编译后只是简单字符的替换,那如果我想将PI以字符串的形式打印出来呢,该如何操作?
其实这还不好操作,直接将一个字符串取一个别名如:
#define HELLO "hello World!"int main(){printf("the string is:%s",HELLO);return 0;}
结果是:the string is:hello World!
既然这样,那就再问一个问题,如果一开始你就跟本不知道定义的宏是个字符串形式呢?如:
#define PI 3.141592654
我依然想将3.141592654
打印出来,该如何操作呢?
2. 分析思路
需要将宏打印出来,其实就是将#define PI 3.141592654
转换成#define PI “3.141592654”
。
在这里需要用到#
符号,它是一个预处理运算法,作用是将语言符号转化成字符串。然后先来实验下:
#include<stdio.h>#define PI 3.141592654#define str(s) #sint main(){ printf("printf:%s\n",str(PI)); return 0;}
然后进行预编译命令: gcc -E test.c -o test.i
编译后得到的test.i文件就是预编译后的文件,打开查看里面有如下内容:
int main(){printf("printf:%s\n","PI");return 0;}
我们要的是3.141592654
,而不是PI
字符串,所以需要再加个宏定义,具体如下:
#include<stdio.h>#define PI 3.141592654#define xstr(s) str(s)#define str(s) #sint main(){ printf("printf:%s\n",xstr(PI)); return 0;}
同样按前面的方式进行预编译,得到的预编译文件大体如下:
int main(){printf("printf:%s\n","3.141592654");return 0;}
通过它编译出来的程序,执行结果如下:
user@user-Lenovo-Product:/local/sdb/tempFile/cTest$ ./test.oprintf:3.141592654
3. 总结
这个问题也是无意中看到的,在解决一个问题时,当时是希望将宏写入到编译后的文件中(即编译后文件会分配空间并存储该宏的内容),具体如图所示:
然后发现有使用打印宏的这个功能,感觉比较有趣,做个笔记方便后面查询。
- 打印宏
- 打印宏
- 打印错误信息的宏
- 打印输出宏
- 宏定义日志打印
- 自定义的打印宏
- 打印宏定义
- C gdb打印宏
- 宏函数打印日志
- 宏变量的打印
- 打印
- 打印
- 打印
- 打印
- 打印
- 打印
- 打印
- 打印
- 1004. Counting Leaves (30)[bfs]
- handle message Looper源码解析
- C language manual
- 2017年8月7日 星期一
- caffe 学习教程
- 打印宏
- hadoop2.x完全分布式环境搭建
- gan train real_test
- Java包装类与基本类型进行比较的坑
- 一、jenkins介绍
- 算法:拯救大兵瑞恩(BFS+状态压缩)
- 磁盘管理(2)
- ZCMU-1019: 分金币
- 20170807