发新帖我要提问
12
返回列表
打印

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

[复制链接]
楼主: 原野之狼
手机看帖
扫描二维码
随时随地手机跟帖
21
dld2| | 2008-6-5 15:37 | 只看该作者 回帖奖励 |倒序浏览

一直不解的两个问题

printf的参数表是怎么回事。
带参数宏的替代规则。

使用特权

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

回答一下楼上的问题~~

printf的参数表是怎么回事。
那是C标准,只是教材上没写。
这里需要明白两条:第一、变参 的C标准。第二、参数传递规则。

带参数宏的替代规则。
宏在编译的时候进行展开,带参数宏自然就是呆着参数展开。
例如:
#define PI 3.14159
则程序中所有的 PI 都用3.14159替换。

#define MAX(a,b) ((a)>(b)?(a):(b))
则程序所有的 MAX(para1,para2) 带参宏都用 ((para1)>(para2)?(para1):(para2)) 语句替换。

使用特权

评论回复
23
aweyfan| | 2008-6-5 16:37 | 只看该作者

不定参数的宏移植问题多多

不同编译器下关键字不一样

使用特权

评论回复
24
dld2| | 2008-6-5 17:01 | 只看该作者

谢谢楼主很专业的回答

当年考虑这个问题时,在网上查到的写法是:
#define dbgprint(fmt,...) Uart_Printf(fmt,__VA_ARGS__)

但DEBUG关闭时,我用
#define dbgprint(fmt,...)
编译通不过。当dbgprint("abc")时,ARM编译器认为参数不足。而dbgprint("%d",a)是可以的。

现在,参考18楼的写法改成
#define dbgprint(...) 
编译能通过了。

曾经一度的写法是:
#ifdef DEBUG
    #define dbgprint     Uart_Printf
    //#define dbgprint Lcd_Printf
#else
    #define dbgprint    None_Printf
#endif

void None_Printf(char *fmt,...)
{
}

使用特权

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

晕~宏竟然也可以...,开眼界了~

谢谢25楼指点!
只是不知道这种写法的编译器支持如何?
还有这些代码如何去测试一下?
我刚找了些资料速学了一下,似乎
LOG_DEBUG(expr ...) 得改为
LOG_DEBUG(expr,...) 

使用特权

评论回复
26
simon21ic| | 2008-6-6 01:38 | 只看该作者

GCC这里处理不是按照标准的

使用特权

评论回复
27
52mcu| | 2008-6-10 21:15 | 只看该作者

来自vxWroks 的方法

#define DEBUG
#ifdef  DEBUG
    LOCAL UINT32 debug;
    #define DEBUG_PRINT(mask, string) 
                if ((debug & mask) || (mask == DEBUG_ALWAYS)) 
                printf string
#else
    #define DEBUG_PRINT(mask, string)
#endif

使用特权

评论回复
28
kanprin| | 2008-6-11 17:19 | 只看该作者

这也有段lwip的调试开关

#ifdef LWIP_DEBUG
/** print debug message only if debug message type is enabled...
 *  AND is of correct type AND is at least LWIP_DBG_LEVEL
 */
#define LWIP_DEBUGF(debug,x) do { 
                               if ( 
                                   ((debug) & LWIP_DBG_ON) && 
                                   ((debug) & LWIP_DBG_TYPES_ON) && 
                                   ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { 
                                 LWIP_PLATFORM_DIAG(x); 
                                 if ((debug) & LWIP_DBG_HALT) { 
                                   while(1); 
                                 } 
                               } 
                             } while(0)

#else  /* LWIP_DEBUG */
#define LWIP_DEBUGF(debug,x) 
#endif /* LWIP_DEBUG */

使用特权

评论回复
29
eastzsp| | 2008-6-11 18:07 | 只看该作者

调试开关。

使用特权

评论回复
30
yuxiao880| | 2008-6-12 10:40 | 只看该作者

wow bel

buy ffxi gil buy eq plat cheap wow gold =http://www.belrion.com]buy world of warcraft gold buy aoc gold buy L2 adena buy gil cheap gold wow][/url ][url=http://www.belrion.com/en/wow.htm]buy wow gold anyone of you bought/sold any wow gold from www.belrion.com ? I was told they deliver and are good and fast, appreciate if anyone here can give me some feedback ^^ 

使用特权

评论回复
31
空中堡垒| | 2008-6-12 15:18 | 只看该作者

自己习惯使用的方式

#define _DEBUG_

#ifdef _DEBUG_
#define DBG_TRACE(_x_) printf _x_
#else
#define DBG_TRACE(_x_)
#endif

使用时,DBG_TRACE(( "Hello World! " ));
不使用时,直接将"#define _DEBUG_"屏蔽掉即可……

使用特权

评论回复
32
yae| | 2008-6-18 22:07 | 只看该作者

liahi

!!

使用特权

评论回复
33
JunZe| | 2008-6-19 14:59 | 只看该作者

DBPRINTF(x) printf x

#define DEBUG_EN // 

#ifdef DEBUG_EN
#define DBPRINTF(x) printf x
#else
#define DBPRINTF(x)
#endif

void example(void)
{
    DBPRINTF(("execute here!"));

}

使用特权

评论回复
34
hxdlj| | 2008-6-21 20:31 | 只看该作者

条件编译

使用特权

评论回复
35
keaiduole| | 2008-8-3 22:31 | 只看该作者

学习了、、、

使用特权

评论回复
36
后学| | 2008-8-4 08:13 | 只看该作者

define是标准的做法,其它方法不推荐。。。

使用特权

评论回复
37
lhj200304| | 2008-8-6 13:01 | 只看该作者

用assert呀

用assert呀,挺好用的

使用特权

评论回复
38
figoxwm| | 2008-8-6 14:36 | 只看该作者

不错,学习学习

前面提到的

使用特权

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

本版积分规则