打印

我也出道题目凑个热闹~~(公布一下我的做法)

[复制链接]
9314|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
原野之狼|  楼主 | 2008-6-3 17:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在编写程序时,经常应用printf()函数来打印一些调试信息,如果调用此函数的地方比较多,那么系统运行时输出这些调试信息占用的时间与空间是相当大的,当系统运行没有故障时,应该把这些调试信息去掉,以节约时间与空间资源,如果只有一处printf调用,那么直接删掉就行了,如果有十处,一百处,甚至一千处调用,又该如何来删掉呢?而且删除这些调试信息时有可能还是部分删除,不是全部删除,如何来控制这种有选择的删除?


***********************************************
看看我的做法,截取部分代码如下:

//my_dbg.h

//若要开启调试,则定义此宏,否则,注释掉即可,
//这样程序中所有my_printf语句自动消失。
//#define MY_DBG

void redundancy(const char *p,...);

#ifndef MY_DBG
  #define my_printf 1?(void)0:redundancy
#else
  #define my_printf prinf
#endif

//my_dbg.c

void redundancy(const char *p,...)
{
  p=p;
}

//main.c

int main(void)
{
   my_printf("hahaha~~~");//此处 my_printf等效于printf,可以放心使用。在本例中,此语句没有被编译。
   while(1);
   return 0;
}

相关帖子

沙发
and| | 2008-6-3 17:26 | 只看该作者

看看

可以用宏开关控制,但感觉写起来代码不好看。

也可以定义不同级别的一组打印函数
Printf1
Printf2
...
Printfn
不用的时候,把相应的Printfn函数,直接return就行了。

Printfn内部调用sprintf,以及处理字符串输出。

使用特权

评论回复
板凳
yewuyi| | 2008-6-3 17:36 | 只看该作者

#define debug

使用特权

评论回复
地板
dld2| | 2008-6-3 18:32 | 只看该作者

搬个小板凳

使用特权

评论回复
5
xwj| | 2008-6-3 18:38 | 只看该作者

明显该用条件编译

平时的printf()就是带了开关的宏即可

使用特权

评论回复
6
ayb_ice| | 2008-6-3 20:08 | 只看该作者

这很容易

#define DEBUG_EN 1    // 0,1

#if DEBUG_EN > 0
    #define PRINTF printf
#else
    #define PRINTF
#endif

使用特权

评论回复
7
dld2| | 2008-6-3 21:04 | 只看该作者

楼上的成立吗

PRINTF(“abc”);
在#define DEBUG_EN 0
时编译通不过吧。

使用特权

评论回复
8
simon21ic| | 2008-6-3 21:11 | 只看该作者

一般程序可以设置一个Debug Level

比如:
OpenOCD的-d 3
Avrdude的-v -v -v -v
然后程序中更具不同的Debug Level输出不同等级的信息
这些程序运行在PC上,所以Debug_Level是变量,如果是嵌入式应用的话,可以定义一个DBG_LEVEL常量

个人觉得OpenOCD做的非常的好,可以参考一下OpenOCD的调试信息输出格式
原理很简单,#define宏中可以使用...和__VA_ARGS__

使用特权

评论回复
9
gtw| | 2008-6-3 21:24 | 只看该作者

接6楼、8楼

#define DEBUG_MODE_0  0
#define DEBUG_MODE_1  1
#define DEBUG_MODE_2  2

// 设定全局调试等级
#define DEBUG_MODE ( DEBUG_MODE_1 )

// content为printf的参数
// debugmode为本次插入调试语句的等级
#define PRINTF(content,debugmode) if ((debugmode)<=DEBUG_MODE) printf(content)

当debugmode和DEBUG_MODE同为常数时,编译器通常会自动优化调(debugmode<=DEBUG_MODE)的比较。

使用特权

评论回复
10
dld2| | 2008-6-3 21:35 | 只看该作者

9楼

“#define PRINTF(content,debugmode) if ((debugmode)<=DEBUG_MODE) printf(content)”

PRINTF("%d,%d",a,b,DEBUG_MODE_0 );
是这样用吗?

使用特权

评论回复
11
acmilann| | 2008-6-3 22:04 | 只看该作者

#ifdef …… #endif

这样就行
#ifdef DEBUG_E
  printf("");
#endif

如果要用printf()
在最前面加
#define DEBUG_E

如果不要要用printf()
在最前面加
//#define DEBUG_E
就行

使用特权

评论回复
12
gtw| | 2008-6-3 23:37 | 只看该作者

-》

#define PRINTF(content,debugmode) if ((debugmode)<=DEBUG_MODE) printf(content)

-》

// content 为需要调试语句
#define DEBUG(content,debugmode) if ((debugmode)<=DEBUG_MODE){ 
                                     content; 
                                 }


DEBUG(printf("%d,%d",a,b),DEBUG_MODE_0 );

使用特权

评论回复
13
原野之狼|  楼主 | 2008-6-4 09:12 | 只看该作者

答案是丰富多彩的,只要能实现就好~

使用特权

评论回复
14
wswh2o| | 2008-6-4 16:07 | 只看该作者

肯定是预编译

使用特权

评论回复
15
wangkj| | 2008-6-4 16:13 | 只看该作者

linux kernel中有大量的这种代码的例子

也就是ls诸位说的,就这几种方法。

使用特权

评论回复
16
原野之狼|  楼主 | 2008-6-5 12:05 | 只看该作者

看看我的做法~

见主贴。

使用特权

评论回复
17
原野之狼|  楼主 | 2008-6-5 12:12 | 只看该作者

12楼的分级方法不错。。。

使用特权

评论回复
18
simon21ic| | 2008-6-5 13:20 | 只看该作者

LZ这个圈子兜的。。。

#if DBG_EN
#    define DBG_OUT(...)    fprintf(stderr,__VA_ARGS__)
#else
#    define DBG_OUT(...)
#endif
抛砖引玉,只是简单使用时的情况

使用特权

评论回复
19
gyt| | 2008-6-5 13:40 | 只看该作者

精干

使用特权

评论回复
20
原野之狼|  楼主 | 2008-6-5 14:14 | 只看该作者

请问18楼:simon21ic

可以这么用么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

187

主题

8547

帖子

280

粉丝