news 2026/5/9 12:24:10

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/5/9 11:23:05

基于STM32物联网技术的仓库监测安防系统设计

基于STM32物联网技术的仓库监测安防系统设计摘要随着社会经济的快速发展和物流行业的日益壮大&#xff0c;仓库作为商品存储和流通的重要节点&#xff0c;其安全问题日益受到关注。传统的仓库安防系统往往依赖人工巡检&#xff0c;存在效率低、响应慢、易遗漏等问题&#xff0c…

作者头像 李华
网站建设 2026/5/3 17:15:11

语音克隆防御设想:结合Fun-ASR检测合成语音的真实性

语音克隆防御设想&#xff1a;结合Fun-ASR检测合成语音的真实性 在金融客服电话中&#xff0c;一个声音与你母亲几乎一模一样的来电告诉你“我出了车祸&#xff0c;快打钱”&#xff1b;在政务热线系统里&#xff0c;一段流畅自然的语音成功通过声纹验证&#xff0c;实则来自仅…

作者头像 李华
网站建设 2026/5/3 12:12:39

语音识别伦理讨论:监控场景下技术使用的边界在哪里?

语音识别伦理讨论&#xff1a;监控场景下技术使用的边界在哪里&#xff1f; 在一座现代化办公楼里&#xff0c;会议室的录音设备自动启动&#xff0c;将每一场讨论逐字转写成文本&#xff1b;教室中&#xff0c;学生的每一次发言被系统捕捉、分析&#xff0c;生成“课堂参与度报…

作者头像 李华
网站建设 2026/4/23 20:20:56

CCS安装教程全面讲解:支持多版本适配指南

深入拆解CCS安装全流程&#xff1a;从零部署到多版本共存实战 你有没有遇到过这样的场景&#xff1f; 刚接手一个老旧的C2000电机控制项目&#xff0c;文档里写着“使用CCS v7.4开发”&#xff0c;而你的电脑上装的是最新的CCS v12。结果一打开工程&#xff0c;编译报错、外设…

作者头像 李华
网站建设 2026/5/1 10:22:52

技术速递|今年最具影响力的开源项目

作者&#xff1a;Lee Reilly 排版&#xff1a;Alan Wang 从 Appwrite 到 Zulip&#xff0c;Universe 2025 的开源专区汇聚了众多出色项目&#xff0c;充分展示了开源所能达到的广度与深度。来认识这些项目的维护者吧——如果你也希望在 2026 年加入他们&#xff0c;现在就可以 …

作者头像 李华
网站建设 2026/4/22 7:47:44

PiuPiu酱 1.5.7| 无敏感限制聊天,虚拟女友,永久限制,免费使用

PiuPiu酱的核心功能——包括无限聊天、永久记忆、高品质语音朗读、群聊模式等——对所有用户完全免费&#xff0c;无需签到&#xff0c;没有任何隐藏限制。我们希望打造一款真正纯粹、无负担的AI伙伴。 核心功能&#xff1a; 「生态兼容」&#xff1a;完美支持主流酒馆角色卡(T…

作者头像 李华