news 2026/10/15 18:22:26

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/10/15 8:58:49

Amazon CloudWatch 的系统化知识点汇总

一、Amazon CloudWatch 是什么 Amazon CloudWatch 是 AWS 提供的 托管式监控与可观测性服务&#xff0c;用于&#xff1a;收集指标&#xff08;Metrics&#xff09;收集和分析日志&#xff08;Logs&#xff09;设置告警&#xff08;Alarms&#xff09;自动触发动作&#xff08;…

作者头像 李华
网站建设 2026/10/15 5:20:39

提升生产力利器:将Fun-ASR嵌入日常工作流的五种方式

提升生产力利器&#xff1a;将Fun-ASR嵌入日常工作流的五种方式 在每天被会议、语音备忘录和客户通话填满的工作节奏中&#xff0c;你是否曾想过——那些说出口的话&#xff0c;能不能直接变成可编辑、可搜索、可归档的文字&#xff1f;更进一步&#xff0c;如果这个过程不需要…

作者头像 李华
网站建设 2026/10/13 20:44:52

微信小程序联动:扫码上传音频获取识别结果的新方式

微信小程序联动&#xff1a;扫码上传音频获取识别结果的新方式 在会议室角落的白板旁&#xff0c;一张不起眼的二维码静静贴着。一位员工走进来&#xff0c;打开微信&#xff0c;轻轻一扫——手机立刻跳转到一个简洁的上传页面。他点击“录音”&#xff0c;说完一段会议要点&am…

作者头像 李华
网站建设 2026/10/15 16:01:35

语音情感识别延伸方向:在ASR基础上增加情绪判断模块

语音情感识别延伸方向&#xff1a;在ASR基础上增加情绪判断模块 在智能客服系统中&#xff0c;一个用户反复强调“我已经等了快半小时&#xff01;”——文字内容清晰明了&#xff0c;但若仅依赖传统语音识别&#xff08;ASR&#xff09;&#xff0c;系统可能只会机械地记录这句…

作者头像 李华
网站建设 2026/10/14 0:05:39

直播公开课预告:每周三晚八点讲解进阶用法

Fun-ASR WebUI 技术解析&#xff1a;从语音识别到工程落地的完整实践 在智能办公、远程会议和内容创作日益普及的今天&#xff0c;如何高效地将语音转化为准确、规范的文字&#xff0c;已成为许多开发者和业务人员面临的核心问题。传统的语音识别方案往往依赖复杂的模型部署流程…

作者头像 李华
网站建设 2026/10/15 4:36:19

沙漠油田作业区:沙尘防护外壳设计专利申报

沙漠油田作业区的AI语音系统&#xff1a;从沙尘防护到边缘部署的全链路实践 在新疆塔克拉玛干沙漠腹地的一处油田作业现场&#xff0c;巡检人员顶着烈日完成一轮设备检查后&#xff0c;掏出录音笔回放了一段长达40分钟的口头汇报。这段音频将被上传至本地服务器&#xff0c;由一…

作者头像 李华