DEBUGMSG,RETAILMSG,NKDbgPrintfW的实现

来源:互联网 发布:excel处理大量数据 编辑:程序博客网 时间:2024/05/21 17:27

从http://blog.csdn.net/bbw2008/archive/2010/12/20/6087738.aspx里看到:

NKDbgPrintfW(..)函数一般只在OAL中使用,可以直接从串口中打印出信息,不受编译选项的影响。
DEBUGMSG(..)函数只有在工程在Debug模式下编译以后,才会打印出信息来。如果是在Release模式下编译的,就不会打印信息出 来。
RETAILMSG(..)函数在Debug模式下和Release模式下编译都会打印出调试信息,但是如果你在工程的属性中的"Build option"中选择了"Enable ship build",那么RETAILMSG函数就不会打印信息了。

在 D:/WINCE600/PUBLIC/COMMON/SDK/INC/dbgapi.h 中,

#define DEBUGMSG(cond,printf_exp)   /
   ((void)((cond)?(NKDbgPrintfW printf_exp),1:0))

#define RETAILMSG(cond,printf_exp)   /
   ((cond)?(NKDbgPrintfW printf_exp),1:0)
在D:/WINCE600/PRIVATE/WINCEOS/COREOS/NK/KERNEL/printf.c中,

void WINAPIV
NKDbgPrintfW(
    LPCWSTR lpszFmt,
    ...
    ) 
{
    va_list arglist;
    va_start(arglist, lpszFmt);
    NKvDbgPrintfW(lpszFmt, arglist);
    va_end(arglist);
}

NKvDbgPrintfW(lpszFmt, arglist);最后调用OEMWriteDebugString(); 这是oal层的debug.c里来实现。

对于三目运算符,标准格式为<表达式1>?<表达式2>:<表达式3>; 运算符"?"的含义是:先求表达式1的值,如果为真,则执行表达式2,并返回表达式2的结果; 如果表达式1的值为假,则执行表达式3,并返回表达式3的结果。在此处的宏定义中,问号和分号之间的部分为表达式2,分号之后的部分为表达式3,分别为两种情况下各自需要执行的内容。表达式内部以逗号间隔,从左到右依次执行各语句。对于(NKDbgPrintfW printf_exp)部分,printf_exp是NKDbgPrintfW函数的参数,没有加括号的原因是:在使用这个宏定义时的格式为DBGMSG(1,(TEXT("[SPI] Thread for TX : USE INT /r/n")));,printf_exp最外层有括号,编译时宏定义展开,此处就正好为一个调用函数的完整格式。在网上找到一个简单的例子,很能说明问题。

#include <iostream>
using namespace std;

#define MSG(cond, exp) /
(cond)? (void)(printf exp), 1:0

int main()
{
int i = 2, j = 4, k = 6;

cout << (true ? ++i, j : k) << "/n";
cout << (true ? j, i : k) << "/n";
cout << "Now show macro definition.../n";
cout << (MSG(true, ("i = %d, j = %d, k = %d/n", i, j, k))) << "/n";

return 0;
}

原创粉丝点击