实现这个LOG宏需要了解几个系统宏
_ FILE _以字符串形式返回所在文件名称
_ func _以字符串形式返回所在函数名称
_ LINE _以整数形式返回所在行号
还有变参宏的使用
每次都用printf来打印信息,参数会一直重复,太过繁琐,可以用一个宏来封装printf,只需要写入需要输出还要输出的信息即可,必须要输出的直接封装好,这就是log的目的。
同时##的作用是将变量连接在一起,比如
int abc =4,def = 5;
int abcdef = 0;
#define contact(a,b) a##b
contact(abc,def) = 1;
printf(“%d”,abcdef);
输出结果为1;
可见这里的##有将变量名连接在一起的功能。
#include<stdio.h>
#define log(frm,args...) {\
printf("[%s : %s : %d]",_ _FILE_ _,_ _func_ _,_ _LINE_ _);\
printf(frm,##args);\后面参数和连接在一起,该宏只有一个变量时也不会报错
printf(“\n”);\
}
int main()
{
int a = 5;
log(“%d”,a);
log(“hello word!”);
}
我们在调试时可以有log宏输出,一旦调试完毕,需要提交代码就不能再有log输出了,如果项目很大,那么我们要一个一个去找?
这肯定是不行的,不符合程序员的方式。
那么有什么办法呢?
很简单,条件编译。
#include<stdio.h>
#if DEBUG
#define log(frm,args...) {\
printf("[%s : %s : %d]",_ _FILE_ _,_ _func_ _,_ _LINE_ _);\
printf(frm,##args);\后面参数和连接在一起,该宏只有一个变量时也不会报错
printf(“\n”);\
}
#else
#define log(frm,args)
#endif
int main()
{
int a = 5;
log(“%d”,a);
log(“hello word!”);
}
当我们需要输出log打印时只需要在程序前面定义一个DEBUG宏,或者在编译源程序时,
gcc -D xxx.c
就会在程序前面自动添加一个DEBUG宏