定义在文件 dbgapi.h 里面,[size=4]location[/size]: //PUBLIC//COMMON//SDK//INC//dbgapi.h。
如果是 SHIP_BUILD 版本。 所有的都不会打印出来。
因为
#ifdef SHIP_BUILD
#define ERRORMSG(cond,printf_exp) ((void)0)
#define RETAILMSG(cond,printf_exp) ((void)0)
#define DEBUGMSG(cond,printf_exp) ((void)0)
#define DEBUGLED(cond,parms) ((void)0)
#define DBGCHK(module,exp) ((void)0)
#define DEBUGCHK(exp) ((void)0)
#define DEBUGREGISTER(hMod) ((void)0)
#define RETAILREGISTERZONES(hMod) ((void)0)
#else // SHIP_BUILD
#ifdef DEBUG
#define DEBUGMSG(cond,printf_exp) //
((void)((cond)?(NKDbgPrintfW printf_exp),1:0))
#define DBGCHK(module,exp) //
((void)((exp)?1:( //
NKDbgPrintfW ( TEXT(/"%s: DEBUGCHK failed in file %s at line %d //r//n/"), //
(LPWSTR)module, TEXT(__FILE__) ,__LINE__ ), //
DebugBreak(), //
0 //
)))
#define DEBUGLED(cond,parms) //
((void)((cond)?(WriteDebugLED parms),1:0))
#define DEBUGCHK(exp) DBGCHK(dpCurSettings.lpszName, exp)
extern DBGPARAM dpCurSettings;
#define DEBUGREGISTER(hMod) RegisterDbgZones(hMod, &dpCurSettings)
#else // DEBUG
#define DEBUGMSG(cond,printf_exp) ((void)0)
#define DEBUGLED(cond,parms) ((void)0)
#define DBGCHK(module,exp) ((void)0)
#define DEBUGCHK(exp) ((void)0)
#define DEBUGREGISTER(hMod) ((void)0)
#endif // DEBUG
#define RETAILMSG(cond,printf_exp) //
((cond)?(NKDbgPrintfW printf_exp),1:0)
#define ERRORMSG(cond,printf_exp) //
((cond)?(NKDbgPrintfW(TEXT(/"ERROR: %s line %d: /"),TEXT(__FILE__),__LINE__), NKDbgPrintfW printf_exp),1:0)
#define RETAILREGISTERZONES(hMod) RegisterDbgZones(hMod, &dpCurSettings)
#endif // SHIP_BUILD
DEBUGMSG 只在DEBUG版本时输出信息,而RETAILMSG在DEBUG和Release下都会输出信息。
它们最终都是调用的NKDbgPrintfW 来输出信息。
另外如果将代码移植到其它编译器,可以自己定义RETAILMSG函数,
如:#define RETAILMSG(cond,printf_exp) ((cond)?(Uart_Printf printf_exp),1:0)
Uart_Printf()函数的实现在之前的文章中有所说明。