携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情
宏、枚举和常量(中)
上篇文章讲到了宏的第一种用法,这篇文章我们继续讨论宏的用法。
宏
调试
其实这个也很常见了,就是使用类似#ifdef DEBUG的语句来包裹住只有在调试时才想要运行的语句块,在每次编译时加上-DDEBUG的命令行参数,或者是每次在文件开头使用#define DEBUG,使得这段代码直接在编译阶段就被去除。当然,也可以使用cmd args+if的方法来实现类似的功能。这两种方式的区别在于:使用宏的方式会使得每次都需要重新编译相关代码,而使用命令行参数的话,则每次可以复用新的二进制可执行产物,当然,前者会使得二进制文件体积变小,而且由于宏的好处就是“一处定义、处处可见”所以可以无需像后者一样将参数到处传递(当然,使用全局变量的话,这个问题也可以在一定程度上得到缓解,当然要注意使用处处extern)。
变量名变字符/字符串
通过下面这一小段代码来说明一下宏在变量名与字符串/字符之间转换的作用。
#include <cstdio>
#define FUNC1(a) #a"=%d",a
#define FUNC2(b) #@b
int main() {
int hello = 1, world = 2, helloworld = 3, c = 4;
printf(FUNC1(hello));
return 0;
}
上面这段代码的输出是:
hello=1
其中FUNC1的作用就是将传入的a直接变成字符串常量,这里其实就是变量hello。然后两段字符串常量放在一起共同构成了printf的第一个参数,,a也同样被原样替换为,hello,所以就有了printf("hello=%d",hello)这条语句。很显然,这种用法在log日志中是非常好用的,实现了变量名和变量值之间关联打印的效果。而#@则是让单字节变量变字符。