C语言定制DEBUG信息
C语言定制DEBUG信息
背景与问题
在日常编写程序中,我们经常需要输出一些调试信息帮助我们 DEBUG 或者更好的编程,通常我们的做法是这样的:
- 在需要的地方直接
printf(...)
输出有用的信息; - 不需要的时候把这些调试语句注释掉。
这种做法在日常编写小程序的时候可以使用,但是当参与到比较大的 C 项目时,协作开发的人们经常需要输出各种调试信息,而且会将这些信息分级:日志、警告、严重警告、致命错误等等。当产品正式发布的时候又不能够输出这些调试信息,这时候如果代码行超过千行(不说万、十万、百万、千万了),谁愿意自己手动一行行去注释掉那些调试语句呢?就算你愿意去,你能保证都注释掉了吗?
显然,我们需要一种办法,一键式开关调试语句,C 语言的条件编译也许能够帮助我们。
解决方法
关于简单的 C 语言条件编译语法,我参考了C语言条件编译详解(C语言中文网)。
然后写了一个简单的调试语句分级程序,根据一个分级宏LEVEL
是否决定是否定义 DEBUG 函数,然后根据LEVEL
的值决定定义什么级别的 DEBUG 函数。
#include <stdio.h> #define LEVEL 3 #ifdef LEVEL /*如果定义了 LEVEL 宏*/ /* 那么就根据 LEVEL 分级定义调试函数 */ #if LEVEL >= 1 #define LOG(format, ...) printf("[log] "format"", ##__VA_ARGS__) #endif #if LEVEL >= 2 #define WARNING(format, ...) printf("[warning] "format"", ##__VA_ARGS__) #endif #if LEVEL >= 3 #define ERROR(format, ...) printf("[error] "format"", ##__VA_ARGS__) #endif #else /* 否则将它们都定义为空 */ #define LOG(format, ...) #define WARNING(format, ...) #define ERROR(format, ...) #endif int main() { LOG("hello, %s.\n", "what's your name?"); return 0; }
在第 3 行定义了LEVEL
,值为 3,那么LOG
,WARNING
和ERROR
都会生效。
在大型项目中,这个LEVEL
通常会放到一个配置文件中,方便随时更改它的值。在这里只要把它改成比 1 小的整数就可以令所有调试语句失效(被替换为空)。
编译运行:gcc -o main main.c
,然后./main
即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)