C语言宏定义格式化控制台打印

写了个简单的控制台打印代码,有三种打印级别 DEBUG INFO ERROR,支持颜色打印,支持时间打印
在MSVC环境中使用


#include <time.h>
#include <string.h>
#include <stdio.h>/* log level */
#define LOG_LEVEL_DEBUG  (1)
#define LOG_LEVEL_INFO   (2)
#define LOG_LEVEL_ERROR  (3)/* log config */
#define LOG_OUTPUT_LEVEL LOG_LEVEL_DEBUG/*=== log system component===*/
#define LOG_COLOR_RED       "\033[31;1m"
#define LOG_COLOR_GREEN     "\033[32;1m"
#define LOG_COLOR_YELLOW    "\033[33m"
#define LOG_COLOR_BLUE      "\033[34;1m"
#define LOG_COLOR_CARMINE   "\033[35m"
#define LOG_COLOR_CYAN      "\033[36;1m"
#define LOG_COLOR_WHITE     "\033[37m"
#define LOG_COLOR_DEFAULT
#define LOG_COLOR_END       "\033[m"#define LOG_BASE_FILENAME \(strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : \strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)#define LOG(prefix,format,...)												    \do{                                                                     \time_t t;														\struct tm ti;													\time(&t);														\localtime_s(&ti,&t);											\printf(""prefix" [%d:%02d:%02d] (%s:%d %s) "format"\n",         \ti.tm_hour,ti.tm_min,ti.tm_sec,						    \LOG_BASE_FILENAME,__LINE__,__FUNCTION__,##__VA_ARGS__); \} while (0)#if LOG_LEVEL_DEBUG >= LOG_OUTPUT_LEVEL
#define LOG_DEBUG(fmt,...) LOG(LOG_COLOR_GREEN "[DEBUG]", fmt LOG_COLOR_END,##__VA_ARGS__)
#else
#define LOG_DEBUG(fmt,...)	((void)0)
#endif#if LOG_LEVEL_INFO >= LOG_OUTPUT_LEVEL
#define LOG_INFO(fmt,...) LOG(LOG_COLOR_WHITE "[INFO]", fmt LOG_COLOR_END,##__VA_ARGS__)
#else
#define LOG_INFO(fmt,...)	((void)0)
#endif#if  LOG_LEVEL_ERROR >= LOG_OUTPUT_LEVEL
#define LOG_ERROR(fmt,...) LOG(LOG_COLOR_RED "[ERROR]",fmt LOG_COLOR_END,##__VA_ARGS__)
#else
#define LOG_DEBUG(fmt,...)	((void)0)
#endif

测试结果

int main()
{LOG_DEBUG("Hello World!");LOG_INFO("Hello World!");LOG_ERROR("Hello World!");
}

结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/47397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32 HAL库】全双工I2S+双缓冲DMA的使用

1、配置I2S 我们的有效数据是32位的&#xff0c;使用飞利浦格式。 2、配置DMA **这里需要注意&#xff1a;**i2s的DR寄存器是16位的&#xff0c;如果需要发送32位的数据&#xff0c;是需要写两次DR寄存器的&#xff0c;所以DMA的外设数据宽度设置16位&#xff0c;而不是32位。…

Log4j2原理及应用详解(十三)

本系列文章简介&#xff1a; 在软件开发过程中&#xff0c;日志记录是一个不可或缺的重要环节。它不仅帮助开发者在开发阶段追踪和调试代码&#xff0c;还在软件运行阶段提供了宝贵的运行信息和错误追踪能力。随着软件系统的日益复杂&#xff0c;对日志记录的需求也变得越来越高…

8.3 End-to-end Data Protection (Optional)

8.3 End-to-end Data Protection (Optional) 为了提供从应用程序到NVM介质并返回到应用程序本身的稳健数据保护,可以使用端到端数据保护。如果启用了此可选机制,则将额外的保护信息(例如CRC)添加到逻辑块中,控制器和/或主机软件可以对其进行评估,以确定逻辑块的完整性。…

大模型能干什么

大模型是指具有庞大参数量和复杂结构的机器学习模型。相比于传统的小模型&#xff0c;大模型通常具有更强的表达能力和更高的预测准确性&#xff0c;其在机器学习和人工智能领域中扮演着至关重要的角色&#xff0c;它们能够处理大规模数据和复杂模型&#xff0c;具有广泛的应用…

一文带你读懂MLIR论文,理解MLIR设计准则.

论文MLIR: Scaling Compiler Infrastructure for Domain Specific Computation MLIR&#xff1a;针对特定领域计算扩展编译器基础设施 文章目录 论文MLIR: Scaling Compiler Infrastructure for Domain Specific Computation1. 论文下载2. TVM关于MLIR的讨论3. 论文正文0. 摘要…

02互联网行业的产品方向(2)

数字与策略产品 大数据时代&#xff0c;数据的价值越来越重要。大多数公司开始对内外全部数据进行管理与挖掘&#xff0c;将业务数据化&#xff0c;数据资产化&#xff0c;资产业务化&#xff0c;将数据产品赋能业务&#xff0c;通过数据驱动公司业务发展&#xff0c;支撑公司战…

关于Hadoop生态系统一部分的Catalog

Catalog在大数据处理和分析的上下文中&#xff0c;它不是一个独立的实体或系统&#xff0c;而是数据处理框架&#xff08;如Apache Flink、Apache Hive、Apache Spark等&#xff09;内部的一个组件。它的主要职责是管理和提供数据集的元数据&#xff0c;使得这些框架可以透明地…

Unity VR开发入门:探索虚拟现实世界的无限可能

目录 引言 Unity VR开发基础 1. 安装Unity与VR SDK 2. 创建VR项目 3. 理解VR场景结构 Unity VR开发实战 1. 场景搭建 2. 交互设计 创建C#脚本 编写VRInteractor脚本 应用脚本到场景 注意 修改VRInteractor脚本 3. 用户体验优化 4. 测试与调试 引言 随着科技的飞速…

docker: No space left on device处理与迁移目录

简介&#xff1a;工作中当遇到Docker容器内部的磁盘空间已满。可能的原因包括日志文件过大、临时文件过多或者是Docker容器的存储卷已满&#xff0c;需要我们及时清理相关文件&#xff0c;并对docker的路径进行迁移。 历史攻略&#xff1a; centos&#xff1a;清理磁盘空间 …

知识库问答研究进展与展望

基于知识库的问答(QuestionAnsweringoverKnowledgeBase,KBQA)是问答系统的重要组成部分,要求计算机正确理解自然语言问题的语义,并从知识库中提取问题的答案.早期研究主要关注仅涉及到单个关系三元组的简单问答,近年来,随着以深度学习为代表的表示学习技术在简单问答任务的成功…

Https post 请求时绕过证书验证方案

解决异常&#xff1a;Caused by: java.security.cert.CertificateException: No subject alternative names matching IP address xxx.xx.xx.xx found // Https POST 请求private cn.hutool.json.JSON PostGsData(String url, String appKey, String token, Map<String, Ob…

VMware 虚拟机 ping 不通原因排查

目录 一、检查网络 二、重启虚拟机网络 因为最近遇到了一个比较奇怪的 ping 不通虚拟机的事&#xff0c;在此过程中&#xff0c;检查了很多的设置&#xff0c;故而写一篇文章记录下&#xff0c;如有 VMware 虚拟机 ping 不通可以尝试本文的排查方式。 下面以 VMware 虚拟机为…

Day03-Pod环境变量,容器重启策略,emptyDir,hostPath,nfs存储卷,资源限制及configMap,secret实战案例

Day03-Pod环境变量&#xff0c;容器重启策略&#xff0c;emptyDir&#xff0c;hostPath&#xff0c;nfs存储卷&#xff0c;资源限制及configMap&#xff0c;secret实战案例 0、昨日内容回顾:1、面试题预告1.1 Q1&#xff1a;Pod的容器的三种重启策略:&#xff08;注意&#xff…

数学建模--灰色关联分析法

目录 简介 基本原理 应用场景 优缺点 优点&#xff1a; 缺点&#xff1a; 延伸 灰色关联分析法在水质评价中的具体应用案例是什么&#xff1f; 如何克服灰色关联分析法在主观性强时的数据处理和改进方法&#xff1f; 灰色关联分析法与其他系统分析方法&#xff08;如A…

记录些MySQL题集(17)

一、MySQL索引为何使用B树结构&#xff1f; MySQL的索引机制中&#xff0c;默认使用BTree作为底层的数据结构&#xff0c;但为什么要选择B树呢&#xff1f;有人会说树结构是以二分法查找数据&#xff0c;所以会在很大程度上提升检索性能&#xff0c;这点确实没错&#xff0c;但…

C++初学者指南-5.标准库(第一部分)--标准库查询存在算法

C初学者指南-5.标准库(第一部分)–标准库查询存在算法 文章目录 C初学者指南-5.标准库(第一部分)--标准库查询存在算法any_of / all_of / none_ofcountcount_if相关内容 不熟悉 C 的标准库算法&#xff1f; ⇒ 简介 any_of / all_of / none_of 如果在输入范围(所有元素…

解决django与sqlite3不兼容报SQLite 3.9.0 or later is required错的问题

今天在尝试用pytest进行django的单元测试&#xff0c;pytest用的数据库是sqlite3&#xff0c;在window环境下测试得好好的&#xff0c;但是放到linux环境下就报错&#xff0c;具体是报django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found …

GPT-LLM

本心、输入输出、结果 文章目录 GPT-LLM前言国际公司AI发展概览国内公司AI发展概览GPT-LLM 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_15071263 如果觉得本文对你有帮助,欢迎点赞、收藏、评论 前言 国际公司AI发展概览 公司主要AI贡献与产品特点OpenAI…

【LeetCode】day17:654 - 最大二叉树, 617 - 合并二叉树, 700 - 二叉树搜索树中的搜索, 98 - 验证二叉搜索树

LeetCode 代码随想录跟练 Day17 654.最大二叉树617.合并二叉树700.二叉搜索树中的搜索98.验证二叉搜索树 654.最大二叉树 题目描述&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的…

SpringBoot整合SSE,实现后端主动推送DEMO

前言 说起服务端主动推送&#xff0c;大家第一个想到的一定是WEBSOCKET 。 作为软件工程师&#xff0c;不能无脑使用一种技术&#xff0c;要结合实际情况&#xff0c;择优选取。 SSE&#xff08;Server-Sent Events&#xff09;相比于WEBSOCKET 1、轻量化、兼容性 基于传统…