需求分析
在模块上线后,通常都会在调试阶段会在终端打印一系列日志来报告模块初始化或运行中的状态,由于模块本身存在复杂性以及迭代需求。打印的日志往往越来越多。在很多情况下,一些重要的日志报警并未能够被前场人员或者运维同事发现从而影响了问题处理流程,造成了不必要的人力浪费。
很多时候一些配置或者环境错误会通过终端printf直接打印出来,研发人员为了引起注意一般是添加一连串的符号或者空行来加强展示效果,但是始终欠缺一些吸睛的能力,此时如果能给打印的内容换个醒目的颜色或者增加一些展示效果岂不美哉。本篇文章我向大家分享一个函数实现,如果能给大家的工作带来一点便利,那么此文便实现了它的意义。
原理追述
c语言的printf函数的接口声明如下:
int printf(const char *format, ...);
实际上format字符串不仅是要向终端打印的语句主体,他也支持多种转义符以实现更强的展示效果。
printf 彩色输出需要用到控制命令:\033[属性;前景色;填充色m
支持右侧缺省;
具体实现
#ifndef DIY_PRINTF
/*输出模式*/
#define mode_reset all 0 ///< 重置所有属性
#define mode_highlight 1 ///< 高亮
#define mode_lowlight 2 ///< 低亮
#define mode_underline 4 ///< 下划线
#define mode_blink 5 ///< 闪烁
#define mode_reverse 7 ///< 翻转
#define mode_hide 8 ///< 隐藏
/*前景色列表*/
#define pre_color_black 30
#define pre_color_red 31
#define pre_color_gree 32
#define pre_color_yellow 33
#define pre_color blue 34
#define pre_color_pinksh 35 ///< 品红
#define pre_color_ching 36 ///< 青色
/*背景色默认不做修改*/
char DIY_PRINTFT_BUF[1<< 16];
#define DIY_PRINTF(_mode , _pre_color, _str ,...) \
do{\
snprintf(DIY_PRINTFT_BUF, sizeof(DIY_PRINTFT_BUF), _str , ##__VA_ARGS__);\
printf("\033[0m\033[%d;%dm%s\033[0m\n",_mode, _pre_color,DIY_PRINTFT_BUF);\
}while(0);
#endif
api的声明在原始printf的基础上增加了模式和前景色两个参数,之后的参数设置与printf一致,相比printf多了一次拷贝,但是考虑到printf本身也不用于性能接口中,因此不作追究,同时宏函数可以借用printf函数本身的参数内容检查。
同时在此阐述一下api封装的tip:
函数命名:函数名应具有描述性,能够清晰地表达函数的功能和用途。遵循一致的命名规范,使用有意义的单词或缩写,并采用驼峰命名法或下划线命名法。
参数命名和类型:参数名应该具有描述性,能够清晰地表达参数的作用。参数类型应该准确匹配数据的类型,避免使用模糊的类型(如使用int代替布尔类型)。
返回值类型:返回值类型应该与函数执行的操作或计算结果相匹配,并且应该在注释或文档中明确说明返回值的含义和可能的取值范围。
参数检查:在API声明中,应该对输入参数进行合法性检查,并在文档或注释中明确说明参数的预期行为和限制。这有助于避免潜在的错误和异常情况。
错误处理:在API声明中,应该定义错误码或错误类型,并在文档或注释中说明每个错误的含义和如何处理。同时,应该提供清晰的错误返回机制,以便调用者能够正确处理错误情况。
注释和文档:API声明应该包含清晰、简洁的注释,解释函数或接口的用途、参数和返回值的含义。此外,最好提供完善的文档,详细说明API的使用方法、示例和注意事项。
版本管理:如果API是一个库或框架的一部分,应该考虑版本管理。在API声明中,可以使用版本号标识API的不同版本,并在文档中明确说明每个版本的变化和向后兼容性。
命名空间:为了避免命名冲突,API声明中的标识符应该使用合理的命名空间。可以使用前缀或命名规范来区分不同模块或组件的标识符。
可移植性:在编写API声明时应尽量考虑代码的可移植性,避免依赖于特定的平台或编译器特性。如果有平台相关的代码,应该在文档中进行说明。
成果展示
int main(int argc,const char* argv[]){
DIY_PRINTF(mode_highlight , pre_color_red, "hello world");
DIY_PRINTF(mode_highlight , pre_color_gree, "hello %s","world");
DIY_PRINTF(mode_underline , pre_color_ching, "hello %s","world");
DIY_PRINTF(mode_blink , pre_color_gree, "hello %s","world");
DIY_PRINTF(mode_lowlight , pre_color_pinksh, "hello %s","world");
return 0;
}
最后给大家推荐个高质量超值小课,适合想快速深入掌握某领域技术栈以及需要项目经验的朋友:宝藏入口