c语言log中常用宏介绍
我们在开发过程中,不可避免需要增加调试log,不可避免的需要使用下面宏定义,使我们的log更加清晰有条理。
LINE:行号 使用%d控制输出
DATE:日期 使用%s控制输出
FILE:文件路径 使用%s控制输出
TIME:时间 使用%s控制输出
FUNCTION:调用函数 使用%s控制输出
这些宏不需要定义,编译器就可以识别,我们不需要纠结,只要知道使用即可。
下面是我在Linux和rtos中做的测试,代码很简单,直接使用宏均不会出现问题。
linux(ubuntu测试):
#include <stdio.h>
void main(void)
{
printf("test macro definition start\n");
printf("[%s][%d][%s][%s][%s]\n",__FUNCTION__,__LINE__,__DATE__,__FILE__,__TIME__);
printf("test macro definition end\n");
}
程序输出:
rtos(开发板中测试,截取代码):
printf("[%s][%d][%s][%s][%s]MSC CTL INIT\n",__func__,__LINE__,__DATE__,__FILE__,__TIME__); //__func__宏定义 #define __func__ __FUNCTION__
程序输出:
这里简单说下,自己开发调试过程中,除了使用平台封装好的打印函数(使用时可能存在打印优先级,不同平台差异性也大)外,也可以自己定义宏函数使用,或者如上方法,使用printf时,适当加上行号,函数等,使log更加具有可读性。
这里简单看下linux下常用函数DBG
#define DBG(…) fprintf(stderr, " DBG(%s, %s(), %d): ", FILE, FUNCTION, LINE); fprintf(stderr, VA_ARGS)
#include <stdio.h>
#define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)
void main(void)
{
DBG("TEST DEBUG\n");
}
程序输出:
其中…表示字符串,最终替换__VA_ARGS__被打印出来,模拟其自己定义一个:
#define DBG_G(…) printf("[%s,%d]",FUNCTION,LINE);printf(VA_ARGS) 一样可以使用,实现log前增加函数与行号。
#include <stdio.h>
#define DBG_G(...) printf("[%s,%d]",__FUNCTION__,__LINE__);printf(__VA_ARGS__)
void main(void)
{
DBG_G("TEST DEBUG_G\n");
}
程序输出: