C语言定制DEBUG信息

背景与问题

在日常编写程序中,我们经常需要输出一些调试信息帮助我们 DEBUG 或者更好的编程,通常我们的做法是这样的:

  1. 在需要的地方直接printf(...)输出有用的信息;
  2. 不需要的时候把这些调试语句注释掉

这种做法在日常编写小程序的时候可以使用,但是当参与到比较大的 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,WARNINGERROR都会生效。

在大型项目中,这个LEVEL通常会放到一个配置文件中,方便随时更改它的值。在这里只要把它改成比 1 小的整数就可以令所有调试语句失效(被替换为空)。

编译运行gcc -o main main.c,然后./main即可。

最新文章

  1. Spring MVC 中 HandlerInterceptorAdapter的使用
  2. python PIL比较图片像素
  3. 读书笔记---PMBOK第五版官方中文版
  4. 简明 Git 命令速查表
  5. Scrum项目1.0
  6. BZOJ-3524 Couriers 可持久化线段树
  7. LightOJ1157 LCS Revisited(DP)
  8. 7.mybatis一对多关联查询
  9. log_bin_trust_function_creators错误解决
  10. 用JS给浏览器的关闭按钮添加事件
  11. 转: 用css把图片转为灰色图
  12. Maven之(一)Maven是什么
  13. nginx报错:failed (13: Permission denied)
  14. rdesktop ERROR: CredSSP: Initialize failed, do you have correct kerberos tgt initialized ? Failed to connect, CredSSP required by server
  15. Linux下搭建LAMP环境(YUM)
  16. POI 生成带联动下拉框的excel表格
  17. VB6 red write DB using Microsoft DAO 3.6 Object Library
  18. CSS之旋转立方体
  19. leetcode-39-组合总和(有趣的递归)
  20. golang 正则表达式 匹配局域网

热门文章

  1. Element Ui 安装以及配置
  2. js把秒数转换为HH:MM:SS及时分秒格式
  3. Nginx的概述和配置
  4. perl静态变量
  5. perl按照健值排序
  6. Node.js的学习(二)node.js 模块化
  7. 【Java并发010】使用层面:发令枪CountDownLatch全解析
  8. 漫谈计算机网络:网络层 ------ 重点:IP协议与互联网路由选择协议
  9. 这玩意也太猛了!朋友们,我在此严正呼吁大家:端好饭碗,谨防 AI!
  10. 基于pyecharts的中医药知识图谱可视化