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即可。

C语言定制DEBUG信息的更多相关文章

  1. 屏蔽iOS10模拟器海量的垃圾debug信息

    屏蔽iOS10模拟器海量的垃圾debug信息 不屏蔽之前 进行如下设置 OS_ACTIVITY_MODE = disable 即可屏蔽垃圾信息

  2. linux 将debug信息重定向到LCD(屏幕)

    /*********************************************************************** * linux 将debug信息重定向到LCD(屏幕) ...

  3. log4j配置只打印指定jar或包的DEBUG信息

    有的时候查问题的时候需要打印第三方jar里面的debug信息,假如全部jar都打印的话日志文件会很大,这个时候可以配置log4j只打印指定jar的debug信息或者包,同时输出到了一个新的文件中. 比 ...

  4. 【技巧】Java工程中的Debug信息分级输出接口

    也许本文的标题你们没咋看懂.但是,本文将带大家领略输出调试的威力. 灵感来源 说到灵感,其实是源于笔者在修复服务器的ssh故障时的一个发现. 这个学期初,同袍(容我来一波广告产品页面,同袍官网)原服务 ...

  5. 【技巧】Java工程中的Debug信息分级输出接口及部署模式

    也许本文的标题你们没咋看懂.但是,本文将带大家领略输出调试的威力. 灵感来源 说到灵感,其实是源于笔者在修复服务器的ssh故障时的一个发现. 这个学期初,同袍(容我来一波广告产品页面,同袍官网)原服务 ...

  6. log4j 配置,tomcat 启动或有后台操作时,控制台会显示很多 DEBUG 信息

    log4j 配置,tomcat 启动或有后台操作时,控制台会显示很多 DEBUG 信息 日志信息可以以文件形式显示,也可以在控制台输出,在 log4j.properties 文件设置. 控制台有很多 ...

  7. cocos2d-x 输出debug信息

    cocos2d-x 输出debug信息   在Classes目录下添加文件AppDef.h #ifndef _APP_DEF_H_#define _APP_DEF_H_ #include <an ...

  8. Falsk的模板分配和蓝图、定制错误信息、 和补充

    Flask的模板渲染: Flask的模板在进行渲染的时候是默认选则templates下的html文件 我们可以在实例化app的时候,指定文件来进行选择: 模板渲染更改文件夹:template_fold ...

  9. Android之——JNI配置C语言打印Logcat信息

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47425073 这篇文章给大家介绍一下在JNI中怎样为C语言配置打印Logcat信息 ...

  10. andorid 查看OpenCv Mat的Debug信息

    在进行Android调试时,不能再Console显示Debug信息,只能在LogCat上显示,显示信息如下图: 代码段: public void printMat2Txt(Mat ElemM, Str ...

随机推荐

  1. python进阶(26)collections标准库

    前言 这个模块实现了特定目标的容器,以提供Python标准内建容器dict ,list ,set , 和tuple 的替代选择. 这个模块提供了以下几个函数 函数 作用 namedtuple() 创建 ...

  2. jvm之自动内存管理

    一.运行时数据区 程序计数器(线程私有) 1.程序计数器占用jvm内存较小,主要用来记录当前线程所执行的字节码的位置,因为jvm的多线程都是通过cpu对线程进行来回切换,所以在某个确定的时间cpu只会 ...

  3. 【笔记】CF1607F Robot on the Board 2 及相关

    题目传送门 记忆化搜索 首先,这题 \(10000\) 组 \(2000\times 2000\) 的数据直接爆搜肯定会超时.想到,如果一个点的答案已经被更新过,之后走到这个点能再多走的点也就确定了, ...

  4. Go语言核心36讲47

    你好,我是郝林,今天我们继续分享使用os包中的API. 我们在上一篇文章中.从"os.File类型都实现了哪些io包中的接口"这一问题出发,介绍了一系列的相关内容.今天我们继续围绕 ...

  5. 重要内置函数、常见内置函数、可迭代对象、迭代器对象、for循环的本质、异常捕获处理

    重要内置函数 #zip拉链 zip 函数是可以接收多个可迭代对象,然后把每个可迭代对象中的第i个元素组合在一起,形成一个新的迭代器,类型为元组. l1 = [11, 22, 33] l2 = ['a' ...

  6. 【GUI开发案例】用python爬百度搜索结果,并开发成exe桌面软件!

    一.背景介绍 你好,我是 @马哥python说 ,一名10年程序猿. 1.1 老版本 之前我开发过一个百度搜索的python爬虫代码,具体如下: [python爬虫案例]用python爬取百度的搜索结 ...

  7. webapi+vue跨域session丢失解决方法

    前后端分离中在webapi设置可以跨域,在web.config文件中添加 <httpProtocol>       <customHeaders>         <ad ...

  8. 【Java并发入门】03 互斥锁(上):解决原子性问题

    原子性问题的源头是线程切换 Q:如果禁用 CPU 线程切换是不是就解决这个问题了? A:单核 CPU 可行,但到了多核 CPU 的时候,有可能是不同的核在处理同一个变量,即便不切换线程,也有问题. 所 ...

  9. 写一个flutter程序

    这一部分我们写一个简单应用 功能是,为一个创业公司生成建议的公司名称. 用户可以选择和取消选择的名称,保存喜欢的名称. 该代码一次生成十个名称 用户滚动时,生成新一批名称. 着重体验以下几点 Flut ...

  10. 终于定制出顺手的Obsidian斜杠命令

    wolai.语雀.思源笔记等笔记软件,有一个特别好用的功能,通过斜杠打开快速输入面板,让我们快速输入markdown.插入图片外链.插入文件.插入iframe等,十分方便. 但当我使用obsidian ...