news 2026/7/15 6:17:16

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/7/14 23:43:55

禁止行为清单:不得用于非法监听等用途

Fun-ASR语音识别系统&#xff1a;技术深度解析与合规边界 在远程办公、智能会议和数字笔记日益普及的今天&#xff0c;如何高效地将语音转化为可检索、可编辑的文本&#xff0c;已成为许多企业和个人的核心需求。传统云语音服务虽然便捷&#xff0c;但数据上传带来的隐私顾虑始…

作者头像 李华
网站建设 2026/7/14 23:44:26

视频教程系列上线:B站/YouTube频道可观看

Fun-ASR WebUI&#xff1a;让语音识别真正“开箱即用” 在智能办公、远程协作和自动化服务日益普及的今天&#xff0c;语音转文字技术早已不再是实验室里的高冷概念。从会议纪要自动生成&#xff0c;到客服录音批量分析&#xff0c;再到课堂内容数字化归档——越来越多场景需要…

作者头像 李华
网站建设 2026/7/14 23:44:31

英文文档同步更新:助力全球化推广

英文文档同步更新&#xff1a;助力全球化推广 在跨国会议结束后的清晨&#xff0c;一位项目经理打开电脑&#xff0c;准备整理昨晚长达两小时的英文会议录音。过去&#xff0c;这项任务意味着至少半天的人工听写与校对&#xff1b;而现在&#xff0c;他只需将音频文件拖入一个…

作者头像 李华
网站建设 2026/7/15 0:28:33

构建智能坐席系统第一步:用Fun-ASR实现通话录音转写

构建智能坐席系统第一步&#xff1a;用Fun-ASR实现通话录音转写 在银行、电信、电商等行业的客服中心&#xff0c;每天都有成千上万通电话被记录下来。这些音频背后藏着客户的真实诉求、服务中的潜在问题&#xff0c;甚至是产品改进的关键线索。然而长期以来&#xff0c;大多数…

作者头像 李华
网站建设 2026/7/15 0:27:12

回滚机制预案:一键恢复至上一稳定版本

回滚机制预案&#xff1a;一键恢复至上一稳定版本 在 AI 模型快速迭代的今天&#xff0c;一次看似微小的参数调整或模型升级&#xff0c;可能带来意想不到的连锁反应——语音识别准确率骤降、服务响应延迟飙升、甚至整条推理链路崩溃。尤其是在 Fun-ASR 这类由通义与钉钉联合推…

作者头像 李华
网站建设 2026/7/15 0:28:04

隐私政策透明化:绝不收集无关个人信息

隐私优先的本地语音识别&#xff1a;Fun-ASR 如何实现数据不出设备 在远程办公、在线教育和智能助手普及的今天&#xff0c;语音识别技术早已渗透进日常工作的每一个角落。一次会议录音转文字、一段课堂讲解自动生成笔记、一份访谈内容快速提取要点——这些看似平常的操作背后&…

作者头像 李华