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即可。
C语言定制DEBUG信息的更多相关文章
- 屏蔽iOS10模拟器海量的垃圾debug信息
屏蔽iOS10模拟器海量的垃圾debug信息 不屏蔽之前 进行如下设置 OS_ACTIVITY_MODE = disable 即可屏蔽垃圾信息
- linux 将debug信息重定向到LCD(屏幕)
/*********************************************************************** * linux 将debug信息重定向到LCD(屏幕) ...
- log4j配置只打印指定jar或包的DEBUG信息
有的时候查问题的时候需要打印第三方jar里面的debug信息,假如全部jar都打印的话日志文件会很大,这个时候可以配置log4j只打印指定jar的debug信息或者包,同时输出到了一个新的文件中. 比 ...
- 【技巧】Java工程中的Debug信息分级输出接口
也许本文的标题你们没咋看懂.但是,本文将带大家领略输出调试的威力. 灵感来源 说到灵感,其实是源于笔者在修复服务器的ssh故障时的一个发现. 这个学期初,同袍(容我来一波广告产品页面,同袍官网)原服务 ...
- 【技巧】Java工程中的Debug信息分级输出接口及部署模式
也许本文的标题你们没咋看懂.但是,本文将带大家领略输出调试的威力. 灵感来源 说到灵感,其实是源于笔者在修复服务器的ssh故障时的一个发现. 这个学期初,同袍(容我来一波广告产品页面,同袍官网)原服务 ...
- log4j 配置,tomcat 启动或有后台操作时,控制台会显示很多 DEBUG 信息
log4j 配置,tomcat 启动或有后台操作时,控制台会显示很多 DEBUG 信息 日志信息可以以文件形式显示,也可以在控制台输出,在 log4j.properties 文件设置. 控制台有很多 ...
- cocos2d-x 输出debug信息
cocos2d-x 输出debug信息 在Classes目录下添加文件AppDef.h #ifndef _APP_DEF_H_#define _APP_DEF_H_ #include <an ...
- Falsk的模板分配和蓝图、定制错误信息、 和补充
Flask的模板渲染: Flask的模板在进行渲染的时候是默认选则templates下的html文件 我们可以在实例化app的时候,指定文件来进行选择: 模板渲染更改文件夹:template_fold ...
- Android之——JNI配置C语言打印Logcat信息
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47425073 这篇文章给大家介绍一下在JNI中怎样为C语言配置打印Logcat信息 ...
- andorid 查看OpenCv Mat的Debug信息
在进行Android调试时,不能再Console显示Debug信息,只能在LogCat上显示,显示信息如下图: 代码段: public void printMat2Txt(Mat ElemM, Str ...
随机推荐
- Archlinux安装Picgo配置Typora
Typora堪称为markdown界的老大哥,其大名我们多有耳闻,所见即所的就是他的特点.但是在日常使用中,也经常会碰到一些特别的需求,比如:希望图片能够上传到云端. 怎么将markdown即时粘贴的 ...
- 这篇关于Oracle内存管理方式的介绍太棒了!我必须要转发,很全面。哈哈~
"Oracle内存管理可分为两大类,自动内存管理和手动内存管理.其中手动内存管理又可分为自动共享内存管理,手动共享内存管理,自动PGA内存管理以及手动PGA内存管理.本文会简单的介绍不同的内 ...
- Codeforces Round #832 (Div. 2) A~C题解
目录 A B C A 思路:这个题的话我们把负数和整数分别求出来,比较绝对值的大小,用较大的那个减去较小的那个就可以了. #include <cstring> #include <i ...
- linux下进程的实际用户ID(有效组)和有效用户ID(有效组ID)
实际用户ID(实际组ID):标识当前用户(所属组)是谁,当用户登陆时取自口令文件. 有效用户ID(有效组ID):用来决定我们(当前进程)对文件的访问权(即实际该进程的是以那个用户运行的). 一般情况下 ...
- hashcat 命令
hashcat --force --stdout -a 6 tmp.txt ?d?d?d?d?d?d?d > result.txt tips:将tmp.txt字典中的内容与7位随机掩码字符组合, ...
- 7 STL-deque
重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦! 生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 写在前面,本篇章主要介绍S ...
- 4 c++编程-提高篇-STL简介
重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦! 生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 写在前面,本篇章主要简单介 ...
- MISC相关刷题记录迁移
- DID 2022-12-02
DID第二节课 最低工资对就业率影响(DID) 宾夕法尼亚VS新泽西的快餐店,用边界的好处:在用最低工资法之前,两地工资情况差不多,DID需要两期,92年11月实施,之前之后做电话访问. 数据越全的估 ...
- 2022i春秋-冬季赛nan’s analysis
下载附件,在tcp的0流可以看到一个keyisChunqiuGame00504 在3流处得到压缩包,密码不是上面那个,后面对附件找了几个小时都没发现压缩包密码,我是笨比.后面才看到有在线环境. 然后找 ...