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()输出日志重定向到文件后显示混乱问题

在win32中重定向标准输出不会重定向标准输出

Linux的Shell编程基础(下)--printf 命令/test 命令/流程控制/函数/输入与输出重定向/文件包含

将标准输出重定向到缓冲区,而不是使用 >

STM32为啥要用重定向printf来打印串口数据?直接用串口发送函数不行吗