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

[复制链接]
10644|37
dld2 发表于 2008-6-5 15:37 | 显示全部楼层

一直不解的两个问题

printf的参数表是怎么回事。
带参数宏的替代规则。
 楼主| 原野之狼 发表于 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)) 语句替换。
aweyfan 发表于 2008-6-5 16:37 | 显示全部楼层

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

不同编译器下关键字不一样
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,...)
{
}
 楼主| 原野之狼 发表于 2008-6-5 22:49 | 显示全部楼层

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

谢谢25楼指点!
只是不知道这种写法的编译器支持如何?
还有这些代码如何去测试一下?
我刚找了些资料速学了一下,似乎
LOG_DEBUG(expr ...) 得改为
LOG_DEBUG(expr,...) 
simon21ic 发表于 2008-6-6 01:38 | 显示全部楼层

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

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
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 */
eastzsp 发表于 2008-6-11 18:07 | 显示全部楼层

调试开关。

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 ^^ 
空中堡垒 发表于 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_"屏蔽掉即可……
yae 发表于 2008-6-18 22:07 | 显示全部楼层

liahi

!!
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!"));

}
hxdlj 发表于 2008-6-21 20:31 | 显示全部楼层

条件编译

keaiduole 发表于 2008-8-3 22:31 | 显示全部楼层

学习了、、、

后学 发表于 2008-8-4 08:13 | 显示全部楼层

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

lhj200304 发表于 2008-8-6 13:01 | 显示全部楼层

用assert呀

用assert呀,挺好用的
figoxwm 发表于 2008-8-6 14:36 | 显示全部楼层

不错,学习学习

前面提到的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部