Printf重定义
Posted 旧年不在cd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Printf重定义相关的知识,希望对你有一定的参考价值。
Printf重定义
一、编译器内置宏
ANSI C标准中有几个标准预定义宏(也是常用的):
__LINE__:在源代码中插入当前源代码行号;
__FILE__:在源文件中插入当前源文件名;
__DATE__:在源文件中插入当前的编译日期
__TIME__:在源文件中插入当前编译时间;
__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
__cplusplus:当编写C++程序时该标识符被定义。
二、常用Printf重定义的几种写法
#if __LOG__
#define LOG(format,...) printf("[DATE]:%s, [FILE]:%s, [FUNC]:%s, [LINE]:%04d:"format"\\r\\n", __DATE__, __FILE__, __func__, __LINE__, ##__VA_ARGS__)
#else
#define LOG(format,...) do while (0)
#endif
三、更高级的写法
/******************************************************************************
* @Copyright (C), CVTE Electronics CO.Ltd 2021.
* @File name: log.h
* @Author: Gu Chunqi(guchunqi@cvte.com)
* @Version: V1.0
* @Date: 2021-05-14 11:18:30
* @Description: LOG接口定义头文件
* @Others: None
* @History: <time> <author> <version > <desc>
*******************************************************************************/
#ifndef __LOG_H__
#define __LOG_H__
#include "common_def.h"
#include <stdio.h>
#if __LOG_EN__
#define COLOR_END "\\033[0m"
#define INFO_COLOR "\\033[36m"
#define DEBUG_COLOR "\\033[35m"
#define DEBUG_ARRAY_COLOR "\\033[35m"
#define WARNING_COLOR "\\033[33m"
#define ERROR_COLOR "\\033[31m"
typedef enum
//用户可自定义打印格式
LOG_LEVEL_CUSTOM = 0,
//打印错误
LOG_LEVEL_ERROR,
//打印警告
LOG_LEVEL_WARNING,
//打印调试信息
LOG_LEVEL_DEBUG,
//打印数组信息
LOG_LEVEL_DEBUG_ARRAY,
//打印信息
LOG_LEVEL_INFO,
log_level_enum_t;
#define LOG_INFO(format,...) do\\
if (LOG_LEVEL >= LOG_LEVEL_INFO)\\
\\
printf(INFO_COLOR"[INFO]:[FUNC]:%s, [LINE]:%04d:"format"\\r\\n"COLOR_END, __func__, __LINE__, ##__VA_ARGS__);\\
\\
while(0)
#define LOG_DEBUG(format,...) do\\
if (LOG_LEVEL >= LOG_LEVEL_DEBUG)\\
\\
printf(DEBUG_COLOR"[DEBUG]:[FUNC]:%s, [LINE]:%04d:"format"\\r\\n"COLOR_END, __func__, __LINE__, ##__VA_ARGS__);\\
\\
while(0)
#define LOG_DEBUG_ARRAY(array, num) do\\
if (LOG_LEVEL >= LOG_LEVEL_DEBUG_ARRAY)\\
\\
uint32_t i;\\
uint8_t *a = array;\\
printf(DEBUG_ARRAY_COLOR"[DEBUG_ARRAY]:[FUNC]:%s, [LINE]:%04d:\\r\\n"COLOR_END, __func__, __LINE__);\\
for (i = 0; i < num; i++)\\
\\
printf("%#X ", a[i]);\\
if ((i + 1 ) % 10 == 0)\\
\\
printf("\\r\\n");\\
\\
\\
printf("\\r\\n");\\
\\
while(0)
#define LOG_WARNING(format,...) do\\
if (LOG_LEVEL >= LOG_LEVEL_WARNING)\\
\\
printf(WARNING_COLOR"[WARNING]:[FUNC]:%s, [LINE]:%04d:"format"\\r\\n"COLOR_END, __func__, __LINE__, ##__VA_ARGS__);\\
\\
while(0)
#define LOG_ERROR(format,...) do\\
if (LOG_LEVEL >= LOG_LEVEL_ERROR)\\
\\
printf(ERROR_COLOR"[ERROR]:[FUNC]:%s, [LINE]:%04d:"format"\\r\\n"COLOR_END, __func__, __LINE__, ##__VA_ARGS__);\\
\\
while(0)
#define LOG_CUSTOM(format,...) do\\
if (LOG_LEVEL >= LOG_LEVEL_CUSTOM)\\
\\
printf(format, ##__VA_ARGS__);\\
\\
while(0)
#else
#define LOG_INFO(format,...) do while (0)
#define LOG_DEBUG(format,...) do while (0)
#define LOG_DEBUG_ARRAY(array, num) do while (0)
#define LOG_WARNING(format,...) do while (0)
#define LOG_ERROR(format,...) do while (0)
#define LOG_CUSTOM(format,...) do while (0)
#endif
#endif
四、优化
- 宏定义__FILE__输出太长
//windows
#define filename(x) strrchr(x,'\\\\')?strrchr(x,'\\\\')+1:x
//linux
#define filename(x) strrchr(x,'/')?strrchr(x,'/')+1:x
使用:filename(__FILE__)
以上是关于Printf重定义的主要内容,如果未能解决你的问题,请参考以下文章
STM32 的 printf() 函数串口重定向(HAL库标准库都适用)
使用System.out.printf()输出日志重定向到文件后显示混乱问题