探讨一个C代码的问题。。。。(自己来结贴,呵呵~~~)
[复制链接]
/*****************************
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上做不到这点。