Macro per la creazione di rapporti
È possibile utilizzare le macro _RPTn e _RPTFn, definite in CRTDBG.H, per sostituire l'utilizzo di istruzioni printf per il debug. Queste macro vengono automaticamente eliminate nella build di rilascio quando non è definito _DEBUG, pertanto non è necessario racchiuderle tra istruzioni #ifdef.
Macro |
Descrizione |
---|---|
_RPT0, _RPT1, _RPT2, _RPT3, _RPT4 |
Genera una stringa di messaggio e da zero a quattro argomenti. Da _RPT1 a _RPT4 la stringa di messaggio funge da stringa di formattazione di tipo printf per gli argomenti. |
_RPTF0, _RPTF1, , _RPTF2, _RPTF4 |
Come _RPTn, ma queste macro generano anche il nome file e il numero di riga in cui si trova la macro. |
Si consideri l'esempio seguente:
#ifdef _DEBUG
if ( someVar > MAX_SOMEVAR )
printf( "OVERFLOW! In NameOfThisFunc( ),
someVar=%d, otherVar=%d.\n",
someVar, otherVar );
#endif
Questo codice invia a stdout i valori di someVar e otherVar. È possibile utilizzare la chiamata di _RPTF2 che segue per restituire questi stessi valori nonché il nome file e il numero di riga:
if (someVar > MAX_SOMEVAR) _RPTF2(_CRT_WARN, "In NameOfThisFunc( ), someVar= %d, otherVar= %d\n", someVar, otherVar );
Se si ritiene che una particolare applicazione necessiti di un tipo di report di debug che le macro fornite con la libreria di runtime del linguaggio C non offrono, sarà possibile scrivere una macro progettata appositamente per rispondere alle esigenze specifiche. In uno dei file di intestazione, ad esempio, è possibile includere un codice simile al seguente per definire una macro denominata ALERT_IF2:
#ifndef _DEBUG /* For RELEASE builds */
#define ALERT_IF2(expr, msg, arg1, arg2) do {} while (0)
#else /* For DEBUG builds */
#define ALERT_IF2(expr, msg, arg1, arg2) \
do { \
if ((expr) && \
(1 == _CrtDbgReport(_CRT_ERROR, \
__FILE__, __LINE__, msg, arg1, arg2))) \
_CrtDbgBreak( ); \
} while (0)
#endif
Una chiamata a ALERT_IF2 consente di eseguire tutte le funzioni del codice printf illustrato all'inizio di questo argomento:
ALERT_IF2(someVar > MAX_SOMEVAR, "OVERFLOW! In NameOfThisFunc( ),
someVar=%d, otherVar=%d.\n", someVar, otherVar );
Dal momento che è possibile modificare facilmente una macro personalizzata in modo che invii un report con più o meno informazioni a diverse destinazioni (a seconda di ciò che risulta più comodo), questa tecnica può rivelarsi particolarmente utile con l'evolversi delle esigenze di debug.