news 2026/4/18 11:20:51

debug函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
debug函数

1.debug.c

// dbg.h #pragma once #include <stdio.h> // 日志级别枚举 typedef enum { DBG_NONE = 0, DBG_ERROR = 1, DBG_WARN = 2, DBG_INFO = 3, DBG_DEBUG = 4, DBG_TRACE = 5 } dbg_level_t; // 全局日志级别(外部定义) extern int g_dbg_level; // 带级别的调试宏(使用全局变量) #define dbg_log(level, fmt, ...) \ do { \ if (level <= g_dbg_level) { \ const char *level_str[] = { \ "NONE", "ERROR", "WARN", "INFO", "DEBUG", "TRACE" \ }; \ fprintf(stderr, "[%s] %s:%d:%s(): " fmt, \ level_str[level], __FILE__, __LINE__, \ __func__, ##__VA_ARGS__); \ } \ } while(0) // 快捷宏 #define dbg_error(fmt, ...) dbg_log(DBG_ERROR, fmt, ##__VA_ARGS__) #define dbg_warn(fmt, ...) dbg_log(DBG_WARN, fmt, ##__VA_ARGS__) #define dbg_info(fmt, ...) dbg_log(DBG_INFO, fmt, ##__VA_ARGS__) #define dbg_debug(fmt, ...) dbg_log(DBG_DEBUG, fmt, ##__VA_ARGS__) #define dbg_trace(fmt, ...) dbg_log(DBG_TRACE, fmt, ##__VA_ARGS__)

2.load_config.c

// config_loader.h #pragma once #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // 日志级别枚举 typedef enum { DBG_NONE = 0, DBG_ERROR = 1, DBG_WARN = 2, DBG_INFO = 3, DBG_DEBUG = 4, DBG_TRACE = 5 } dbg_level_t; // 全局日志级别变量 extern int g_dbg_level; // 配置文件名 #define CONFIG_FILE "config.ini" // 从字符串转换为日志级别 static dbg_level_t string_to_level(const char *str) { if (str == NULL) return DBG_INFO; if (strcasecmp(str, "NONE") == 0) return DBG_NONE; if (strcasecmp(str, "ERROR") == 0) return DBG_ERROR; if (strcasecmp(str, "WARN") == 0) return DBG_WARN; if (strcasecmp(str, "INFO") == 0) return DBG_INFO; if (strcasecmp(str, "DEBUG") == 0) return DBG_DEBUG; if (strcasecmp(str, "TRACE") == 0) return DBG_TRACE; // 也支持数字 int num = atoi(str); if (num >= 0 && num <= 5) return num; return DBG_INFO; // 默认值 } // 读取配置文件 void load_config() { FILE *file = fopen(CONFIG_FILE, "r"); if (!file) { printf("无法打开配置文件 %s,使用默认设置\n", CONFIG_FILE); g_dbg_level = DBG_INFO; return; } char line[256]; char section[64] = ""; while (fgets(line, sizeof(line), file)) { // 去掉换行符 line[strcspn(line, "\n")] = 0; // 去掉首尾空格 char *p = line; while (isspace(*p)) p++; char *end = p + strlen(p) - 1; while (end > p && isspace(*end)) *end-- = 0; // 空行或注释 if (*p == 0 || *p == '#' || *p == ';') continue; // 检查是否是节 if (p[0] == '[' && strchr(p, ']')) { char *close_bracket = strchr(p, ']'); *close_bracket = 0; strncpy(section, p + 1, sizeof(section) - 1); continue; } // 解析键值对 char *equal = strchr(p, '='); if (!equal) continue; *equal = 0; char *key = p; char *value = equal + 1; // 去掉键和值的空格 while (isspace(*key)) key++; char *key_end = key + strlen(key) - 1; while (key_end > key && isspace(*key_end)) *key_end-- = 0; while (isspace(*value)) value++; char *value_end = value + strlen(value) - 1; while (value_end > value && isspace(*value_end)) *value_end-- = 0; // 如果是日志配置 if (strcmp(section, "logging") == 0) { if (strcasecmp(key, "level") == 0) { g_dbg_level = string_to_level(value); printf("从配置文件设置日志级别: %s (%d)\n", value, g_dbg_level); } } } fclose(file); } // 更新日志级别(可用于动态调整) void set_log_level(dbg_level_t level) { g_dbg_level = level; printf("日志级别已更改为: %d\n", level); }

3.main.c

// main.c #include "dbg.h" #include "config_loader.h" // 定义全局变量 int g_dbg_level = DBG_INFO; // 默认值 int main() { // 1. 加载配置 load_config(); // 2. 测试各种日志级别 dbg_error("这是一个错误消息\n"); dbg_warn("这是一个警告消息\n"); dbg_info("这是一个信息消息\n"); dbg_debug("这是一个调试消息\n"); dbg_trace("这是一个跟踪消息\n"); // 3. 动态调整级别 printf("\n动态调整日志级别为DEBUG...\n"); set_log_level(DBG_DEBUG); dbg_error("错误消息仍然显示\n"); dbg_debug("现在调试消息也会显示了!\n"); return 0; }

4.添加颜色

// main.c #include "dbg.h" #include "config_loader.h" // 定义全局变量 int g_dbg_level = DBG_INFO; // 默认值 int main() { // 1. 加载配置 load_config(); // 2. 测试各种日志级别 dbg_error("这是一个错误消息\n"); dbg_warn("这是一个警告消息\n"); dbg_info("这是一个信息消息\n"); dbg_debug("这是一个调试消息\n"); dbg_trace("这是一个跟踪消息\n"); // 3. 动态调整级别 printf("\n动态调整日志级别为DEBUG...\n"); set_log_level(DBG_DEBUG); dbg_error("错误消息仍然显示\n"); dbg_debug("现在调试消息也会显示了!\n"); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:42:46

会议纪要自动化生成:Fun-ASR实时流式识别功能实测

会议纪要自动化生成&#xff1a;Fun-ASR实时流式识别功能实测 在一场跨部门线上会议中&#xff0c;你一边发言一边看着屏幕上的文字逐句浮现——不是字幕&#xff0c;而是结构清晰、术语准确的会议记录草稿。这种“所言即所得”的体验&#xff0c;正逐渐从科幻场景走入现实办公…

作者头像 李华
网站建设 2026/4/18 9:15:02

IAR环境变量设置教程:操作指南

IAR环境变量设置实战指南&#xff1a;从零搭建高效嵌入式开发环境你有没有遇到过这样的场景&#xff1f;刚接手一个嵌入式项目&#xff0c;兴冲冲地打开命令行准备构建工程&#xff0c;结果输入iarbuild却提示&#xff1a;“不是内部或外部命令”。或者在CI流水线中&#xff0c…

作者头像 李华
网站建设 2026/4/18 9:21:04

CVE编号申请流程:重大安全问题及时披露

CVE编号申请流程&#xff1a;重大安全问题及时披露 在智能语音技术加速落地的今天&#xff0c;越来越多的企业开始将自动语音识别&#xff08;ASR&#xff09;系统部署于会议记录、客服工单、医疗转录等高敏感场景。作为由钉钉与通义实验室联合推出的高性能语音识别方案&#…

作者头像 李华
网站建设 2026/4/17 16:32:03

中小企业降本增效:自建ASR系统比调用API便宜多少?

中小企业降本增效&#xff1a;自建ASR系统比调用API便宜多少&#xff1f; 在客服中心的工位上&#xff0c;小李正焦急地等待一通30分钟会议录音的转写结果。进度条卡在85%&#xff0c;提示“API请求超时”。这已是本周第三次因网络波动导致识别失败。而另一边&#xff0c;财务部…

作者头像 李华
网站建设 2026/4/17 15:01:47

远程访问配置教程:让团队成员都能使用你的Fun-ASR服务

远程访问配置实战&#xff1a;让团队成员无缝使用你的 Fun-ASR 语音识别服务 在智能办公和远程协作日益普及的今天&#xff0c;语音转文字技术已成为提升会议效率、加速内容生产的重要工具。许多团队已经开始尝试本地部署 AI 模型来保障数据安全与响应速度&#xff0c;但一个常…

作者头像 李华
网站建设 2026/4/16 10:37:58

C#实现SerialPort自动重连机制:操作指南

让串口通信“不死”&#xff1a;C#实现高可用SerialPort自动重连实战你有没有遇到过这样的场景&#xff1f;产线上的传感器通过RS-485连到上位机&#xff0c;一切正常采集数据。突然&#xff0c;某个瞬间数据中断了——不是软件卡死&#xff0c;也不是代码出错&#xff0c;而是…

作者头像 李华