打印

探讨一个C代码的问题。。。。(自己来结贴,呵呵~~~)

[复制链接]
1796|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
原野之狼|  楼主 | 2007-9-30 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*****************************
file:my_debug.h
******************************/

#ifndef _MY_DEBUG_H_
#define _MY_DEBUG_H_

#include <string.h>
#include <stdarg.h>
#include <stdio.h>


#define MY_DEBUG

#ifdef MY_DEBUG
 void my_printf(char *,...);
 #define WriteLog my_printf
#else
 void nop_(char *,...);
 #define WriteLog nop_
#endif

#endif

/*****************************
file:my_debug.c
******************************/

#include "my_debug.h"
#include "uart.h"

#ifdef MY_DEBUG
void my_printf(char *p,...)
{
    va_list va;
    char buf[128];

    va_start(va,p);
    vsprintf(buf,p,va);
    WriteUart_str(buf);

    //to do something here,such as get system time and output it ....or capture some operations by users

    va_end(p);
}
#else
void nop_(char *p,...)
{
}
#endif

/*****************************
file:uart.h
******************************/

#ifndef _UART_H_
#define _UART_H_

void USART_Init();
void Write_USART(unsigned char buffer);
void WriteUart_str(unsigned char *p_str);

#endif

/*****************************
file:uart.c
******************************/

#include "uart.h"
#include "reg52.h"
#include "string.h"

void USART_Init()
{

    TMOD=0x20;
    //SMOD=0;
    TH1=0xfd;
    TL1=0xfd;
    SCON=0x40;
    REN=1;
    TR1=1;
}

void Write_USART(unsigned char buffer)
{
    SBUF=buffer;
     while(!TI);
         TI=0; 
}


char putchar (char ch)
{
    Write_USART(ch);
    return 1;
}


void WriteUart_str(unsigned char *p_str)
{
    unsigned char  count,i;

    count = strlen(p_str);

    for(i=0;i<count;i++)
    {
        Write_USART(*p_str++);
    }
}

/*****************************
file:test_debug.c
******************************/

#include "my_debug.h"
#include "uart.h"


void main()
{
    USART_Init();

    WriteLog("Just have a test.....\n%d    %c    %f\n",(int)10,'M',3.1415926);

    while(1);
}

若在file:my_debug.h 
使 #define MY_DEBUG 有效
那么程序处于调试状态。
WriteLog()函数打印出相关调试信息。
若使 #define MY_DEBUG 无效,
那么程序处于非调试状态。
WriteLog()函数实际上是
nop_()函数,不做任何实际操作,节约空间和时间。
但是我觉得这个做法还是不够完美,因为nop_()还是会消耗资源的。
还有什么更优的方法么?

在VC上可以这样做:
把 file:my_debug.h 中
#ifdef MY_DEBUG
 void my_printf(char *,...);
 #define WriteLog my_printf
#else
 void nop_(char *,...);
 #define WriteLog nop_
#endif
改为
#ifdef MY_DEBUG
 void my_printf(char *,...);
 #define WriteLog my_printf
#else
 void nop_(char *,...);
 #define WriteLog NULL
#endif

这样就把调试信息完全去掉了,但是俺做KEIL上做不到这点。

相关帖子

沙发
古道热肠| | 2007-9-30 17:10 | 只看该作者

可以用宏定义启停调试开关

如下:
#define DebugOn 1

void main(void)
{

   .......
   #ifdef DebugOn
      Printf("This is Only a Debug String");

   #endif
   ......
}

使用特权

评论回复
板凳
原野之狼|  楼主 | 2007-9-30 17:20 | 只看该作者

但是我希望能一句话搞定啊~~~~

就是:

WriteLog("Just have a test.....\n%d    %c    %f\n",(int)10,'M',3.1415926);

如果每次输出调试信息都要来那么一段:
#ifdef MY_DEBUG
WriteLog("Just have a test.....\n%d    %c    %f\n",(int)10,'M',3.1415926);
#endif
我觉得麻烦。

使用特权

评论回复
地板
农民讲习所| | 2007-9-30 21:49 | 只看该作者

:

#ifdef MY_DEBUG
    #define WriteLog(x,y,z,w) do{ my_printf(x,y,z,w);}while(0)
#else
    #define WriteLog(x,y,z,w) do{ ;}while(0)
#endif

使用特权

评论回复
5
原野之狼|  楼主 | 2007-10-8 11:40 | 只看该作者

谢谢老农讲解~~~还有问题:

这样写能实现变长参数么?

使用特权

评论回复
6
原野之狼|  楼主 | 2007-10-8 17:42 | 只看该作者

结贴

经一朋友指点,现在问题解决了,呵呵~~~

其中一文件修改如下,那么在取消调试状态的时候,所有调试语句都被编译器忽略。

整个KEIL工程下载:
https://bbs.21ic.com/upfiles/img/200710/200710817420515.rar

/*****************************
file:my_debug.h
******************************/

#ifndef _MY_DEBUG_H_
#define _MY_DEBUG_H_

#include <string.h>
#include <stdarg.h>
#include <stdio.h>


//#define MY_DEBUG

#ifdef MY_DEBUG
 void my_printf(char *,...);
 #define WriteLog my_printf
#else
void nop_(char *p,...);
 #define WriteLog 1?(void)0:nop_
#endif

#endif


使用特权

评论回复
7
huangqi412| | 2007-10-8 17:59 | 只看该作者

呵呵,学习一下

使用特权

评论回复
8
ayb_ice| | 2007-10-8 18:18 | 只看该作者

这是简单的预处理问题

使用特权

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

本版积分规则

187

主题

8547

帖子

280

粉丝