7730|6

21

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

探讨一个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上做不到这点。
此帖出自单片机论坛

最新回复

这是简单的预处理问题  详情 回复 发表于 2007-10-9 10:18
点赞 关注
 

回复
举报

20

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

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

可以用宏定义启停调试开关
如下: #define DebugOn 1 void main(void) { ....... #ifdef DebugOn Printf("This is Only a Debug String"); #endif ...... }
此帖出自单片机论坛
 
 

回复

21

帖子

0

TA的资源

纯净的硅(中级)

板凳
 

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

但是我希望能一句话搞定啊~~~~ 就是: 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 我觉得麻烦。
此帖出自单片机论坛
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(初级)

4
 

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

#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
此帖出自单片机论坛
 
 
 

回复

21

帖子

0

TA的资源

纯净的硅(中级)

5
 

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

这样写能实现变长参数么?
此帖出自单片机论坛
 
 
 

回复

21

帖子

0

TA的资源

纯净的硅(中级)

6
 

回复: 探讨一个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 *p,...); #define WriteLog 1?(void)0:nop_ #endif #endif
此帖出自单片机论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

7
 

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

这是简单的预处理问题
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表