一,多功能打印
在c语言中,我们经常用c语言自带的printf();去打印字符串等,这在嵌入式开发过程中可以帮助我们认识程序的运行情况。但是c自带的printf();只能打印一种颜色的字体,在串口中部利于我们清楚的分析程序。所以参考网上其他的打印教程,也写了一个更加多功能的打印函数,可以用在所有使用c语言的程序中。
代码地址:https://gitee.com/killerp/mylib.git
二,快速认识log
三种打印都会自动打印调用打印的文件,打印函数在文件的位置,调用打印的函数名称。这样可以是我们在开发过程中更加清楚的了解程序运行的情况,以及代码出错的位置等。也是一种简单的debug手段。
- 普通打印:一般可以用来打印数据,或者初始化成功等。
- 警告打印:警告输入数据错误,空指针等。
- 错误打印:运行时出现的错误。
void main()
{
char *str = "Hello,world!";
LOGI("普通打印");
LOGW("警告打印");
LOGE("错误打印");
LOGI("打印数据 = %d",8);
LOGI("打印字符串:%s",str);
LOGI("打印字符串和数据:%s,I am %d years old",str,3);
}
实现效果如下:
具体怎么用好这三种其实看个人的习惯。如果你有其他类型的打印情况,也可以添加进,毕竟代码也不难理解,欢迎各位大佬反馈。
三,认识代码
目前的代码还不是很完善,主要是效率太低了,接下来我将改善代码,减少代码量。
目前就只有一个log.h
文件,当不需要打印功能时就把LOG_ENABLE 改成0。
log.h
主要是对打印字体颜色的宏定义等。
#ifndef _LOG_
#define _LOG_
#include "stdio.h"
#include "stdlib.h"
#include "stdarg.h"
//LOG功能开关 0则不会进行打印
#define LOG_ENABLE 1
//颜色的宏定义
#define NONE "\e[0m" //消除颜色
#define LOG_RED_H "\e[1;31m" //亮红色
#define LOG_RED_L "\e[0;31m" //暗红色
#define LOG_GREEN_H "\e[1;32m"
#define LOG_GREEN_L "\e[0;32m"
#define LOG_YELLOW_H "\e[1;33m"
#define LOG_YELLOW_L "\e[0;33m"
void log(const char *color,const char *fmt,...);
#if LOG_ENABLE
/*普通打印*/
#define LOGI(fmt,agr...) \
do \
{ \
log(LOG_GREEN_L,fmt,##agr);\
}while(0)
/*警告类型*/
#define LOGW(fmt,agr...) \
do \
{ \
log(LOG_RED_H,fmt,##agr);\
}while(0)
/*错误类型*/
#define LOGE(fmt,agr...) \
do \
{ \
log(LOG_YELLOW_L,fmt,##agr);\
}while(0)
#else //不会打印任何东西
#define LOGI(fmt,agr...)
#define LOGW(fmt,agr...)
#define LOGE(fmt,agr...)
#endif
#endif
比较重要的是函数:
其中的va_list类型是在c标准库
stdarg.h
中定义的,该库主要是定义了一个变量类型 va_list
和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数。可变参数的函数通在参数列表的末尾是使用省略号(,…)定义的。
关于stdarg.h
的详细介绍访问:https://www.runoob.com/cprogramming/c-standard-library-stdarg-h.html
/*
* 打印
*/
void log(const char *color,const char *fmt,...)
{
//打印文件信息,函数信息,设置打印颜色
printf("%s info >> file:%s; line:%d; fuction:%s :",color,__FILE__,__LINE__,__FUNCTION__);
//获取参数...
va_list list;
//初始化参数
va_start(list,fmt);
//打印参数
vprintf(fmt,list);
//关闭参数
va_end(list);
//消除颜色,并换行
printf("\e[0m\r\n");
}