Makra raportowania
Można użyć _RPTn, i _RPTFn makra, zdefiniowane w CRTDBG.H, aby zastąpić stosowanie printf instrukcji do debugowania.Makra te automatycznie znikają w swojej wersji podczas budowy _DEBUG nie jest zdefiniowana, więc nie ma potrzeby, należy ująć je w #ifdefs.
Makro |
Opis |
---|---|
_RPT0, _RPT1, _RPT2, _RPT3, _RPT4 |
Wyświetla ciąg wiadomości i zera do czterech argumentów.Dla _RPT1 przez _RPT4, ciąg wiadomości służy jako ciąg formatowania stylu printf dla argumentów. |
_RPTF0, _RPTF1, ,_RPTF2, _RPTF4 |
Taki sam jak _RPTn , ale tych makr również wyjściowy plik nazwą i numerem wiersza gdzie znajduje się makro. |
Rozważmy następujący przykład:
#ifdef _DEBUG
if ( someVar > MAX_SOMEVAR )
printf( "OVERFLOW! In NameOfThisFunc( ),
someVar=%d, otherVar=%d.\n",
someVar, otherVar );
#endif
Ten kod wyświetla wartości someVar i otherVar do stdout.Można zastosować poniższe wywołanie do _RPTF2 z raportu te te same wartości i, dodatkowo, nazwa i wiersza numer pliku:
if (someVar > MAX_SOMEVAR) _RPTF2(_CRT_WARN, "In NameOfThisFunc( ), someVar= %d, otherVar= %d\n", someVar, otherVar );
Jeśli okaże się, że określona aplikacja potrzebuje debugowania, sprawozdawczość, które nie zapewniają makra dostarczane z biblioteki wykonawczej C, należy napisać makro zaprojektowany specjalnie do własnych wymagań.W jednym z plików nagłówka, na przykład, można to kod jak następujących czynności, aby zdefiniować makro o nazwie 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
Jedno wywołanie ALERT_IF2 może wykonać wszystkie funkcje printf kod na początku tego tematu:
ALERT_IF2(someVar > MAX_SOMEVAR, "OVERFLOW! In NameOfThisFunc( ),
someVar=%d, otherVar=%d.\n", someVar, otherVar );
Ponieważ niestandardowe makra można łatwo zmienić, aby zgłosić więcej lub mniej informacji w różne miejsca docelowe (w zależności od co jest wygodniejsze), takie podejście może być szczególnie przydatne, jak debugowania wymagania rozwijać.