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 ...
随机推荐
- Sqlite 安装操作使用
一.什么是 SQLite 数据库 SQLite 是嵌入式SQL数据库引擎.与大多数其他 SQL 数据库不同,SQLite 没有单独的服务器进程.SQLite 直接读取和写入普通磁盘文件.具有多个表,索 ...
- 带你从0到1开发AI图像分类应用
摘要:通过一个垃圾分类应用的开发示例,介绍AI Gallery在AI应用开发流程中的作用. 本文分享自华为云社区<AI Gallery:从0到1开发AI图像分类应用>,作者: yd_269 ...
- NC-日志配置及代码详解
目录 一.日志文件输出说明 二.日志配置说明 2.1 配置文件路径 2.2 配置格式 2.2.1 参数说明 三.代码说明 四.自定义日志实例 实例1-新建日志类 实例2-直接在代码中使用日志输出 五. ...
- Oracle中新建数据表的两种方法
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...
- 2022春每日一题:Day 33
题目:[USACO 6.1.3] Cow XOR 没找到这题具体网址,这个题就是求最大异或区间(总长度尽量小,右端点尽量大) 嗯很显然一个[l,r]的异或和=s[r]s[l-1],那么现在有了优秀的n ...
- PHP 模仿表单提交
function curl($url,$data,$headers){ $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_UR ...
- telnet 退出失败
1. 根据提示,使用ctrl+] ,退出到telnet >界面 2. 使用quit退出 3. 最简单的退出方式,强制退出: ] + Enter键
- vue项目中,alert使用
methods:{ sendData() { ··· // 中间省略的代码 alert(`发送成功,连接失败的号码有:${failList}`) // failList里存的是后台返回的数据 } }
- Android Studio 卡在download fastutil下载慢
需要替换国内镜像,现在阿里云地址已经更新了.需要使用新的地址.可以参考 https://developer.aliyun.com/mvn/guide 以下是更改buil.gradle文件的代码 // ...
- 第五章:matplotlib水印和桑基图
1.Matplotlib水印 1 import matplotlib.pyplot as plt 2 import numpy as np 3 4 x = np.linspace(0.0,10,40) ...