从http://blog.youkuaiyun.com/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;
}