打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
用宏构建自己的printf函数

在调试程序时,通过屏幕输出一些辅助信息,可大大方便调试。但是调试完毕后,这些语句可能就不再需要了。如果一条条的删除会是件很痛苦的事情。那怎么快速的在调试状态和发布状态切换呢?通常我们使用预编译加宏定义来处理这个问题,例如:

#ifdef DEBUG

调试代码

#endif

如果我们使用printf来显示一些调试信息,那么每个地方都加上#ifdef#endif就很麻烦了。我们可以定义一个自己PRINTF函数来专门处理这些事情,只在PRINTF函数内放上#ifdef#endif就行了。但是这样代码在运行时,还是有调用一次函数的,浪费了时间。那么可不可以利用宏定义,实现完全没有编译代码产生的宏呢?答案是肯定的,综合网上的几个例子,大体有以下三种实现方式:

形式一:

#ifdef DEBUG

#define PRINTF(x) printf x

#else

#define PRINTF(x) ((void)0)

#endif

使用时,PRINTF(( "Hello World!\n\r" ));

注意这里是两个括号,一个会报错。而且如果忘记写某个括号的话,会报很多莫名其妙的错误。这种方式的缺点就是要写两个括号。

形式二:

#ifdef DEBUG

#define PRINTF printf

#else

#define PRINTF /\

/PRINTF

#endif

如果DEBUG已经定义了,那么不用说,当然是用printf去代替PRINTF了。

下面只分析DEBUG未定义的情形,这个宏定义实际上是将“PRINTF”定义成了“// PRINTF”。由于续行符的作用,在展开到代码之后,就成了注释符“//”了。也就是说,原来的代码是PRINTF ("%d",x).经过这个宏展开后成了// PRINTF ("%d",x),相当于自动在前面加了注释符“//”。要注意的是,续行符后面的“/”一定要顶格写,否则就不是“//”了。另外,这个宏只能单独一行使用,因为它将该行后面的代码都注释掉了。

这种方法在编译时会出现很多的警告信息,比较烦人。

形式三:

//#define DEBUG

#ifdef DEBUG

#define DBG(CODE) CODE

#else

#define DBG(CODE)

#endif

就是写代码的时候,对于调试信息加上DBG,稍微麻烦点,例如

DBG(printf("%d",x);)

这样就不会出什么问题了,而且还可以在里面写很多行代码。

综合比较,三种形式各有优缺点。个人比较喜欢形式一和形式三。由于在TIST的代码调试中经常使用形式一,所以选择了形式一。其实形式三也是很好的。其应用不仅限于printf语句,还可以扩展到很多其他语句中。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
长文 | 花了两天时间整理了STM32中的一些C语言知识点,初学者福利!老鸟复习
预编译#define #ifdef #endif
宏总结
C语言中的预处理详解
预处理命令之条件编译(#ifdef,#else,#endif,#if等)
#ifndef #endif用法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服