Makros für die Berichterstellung

Aktualisiert: November 2007

Dieses Thema gilt für folgende Anwendungsbereiche:

Edition

Visual Basic

C#

C++

Web Developer

Express

Nur "Systemeigen"

Standard

Nur "Systemeigen"

Pro und Team

Nur "Systemeigen"

Tabellenlegende:

Vorhanden

Nicht vorhanden

Befehl oder Befehle, die standardmäßig ausgeblendet sind.

Mithilfe der in CRTDBG.H definierten Makros _RPTn und _RPTFn lassen sich Codefolgen ersetzen, in denen printf-Anweisungen zum Debuggen verwendet werden. Da diese Makros automatisch aus dem Releasebuild entfernt werden, wenn _DEBUG nicht definiert ist, müssen sie nicht in #ifdef-Blöcke eingeschlossen werden.

Makro

Funktion

_RPT0, _RPT1, _RPT2, _RPT3, _RPT4

Gibt eine Meldungszeichenfolge und 0 (null) bis vier Argumente aus.

Bei _RPT1 bis _RPT4 fungiert die Meldungszeichenfolge als printf-Formatzeichenfolge für die Argumente.

_RPTF0, _RPTF1, _RPTF2, _RPTF4

Identisch mit _RPTn, bei diesen Makros wird jedoch zusätzlich der Name der Datei und die Zeilennummer ausgegeben, in der sich das Makro befindet.

Betrachten Sie das folgende Beispiel:

#ifdef _DEBUG
    if ( someVar > MAX_SOMEVAR )
        printf( "OVERFLOW! In NameOfThisFunc( ),
               someVar=%d, otherVar=%d.\n",
               someVar, otherVar );
#endif

Durch diesen Code werden die Werte von someVar und otherVar in stdout ausgegeben. Sie können den folgenden Aufruf von _RPTF2 verwenden, um dieselben Werte und zusätzlich Dateinamen und Zeilennummer auszugeben:

if (someVar > MAX_SOMEVAR) _RPTF2(_CRT_WARN, "In NameOfThisFunc( ), someVar= %d, otherVar= %d\n", someVar, otherVar );

Wenn Sie für eine bestimmte Anwendung Debugberichte benötigen, die mit den Makros aus der C-Laufzeitbibliothek nicht erstellt werden können, können Sie selbst ein geeignetes Makro schreiben. Beispielsweise könnten Sie in eine der Headerdateien mit dem folgenden Beispiel vergleichbaren Code einfügen, durch den ein Makro mit dem Namen ALERT_IF2 definiert wird:

#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

Durch einen Aufruf von ALERT_IF2 könnten dann alle Funktionen des printf-Codes am Anfang dieses Themas ausgeführt werden:

ALERT_IF2(someVar > MAX_SOMEVAR, "OVERFLOW! In NameOfThisFunc( ), 
someVar=%d, otherVar=%d.\n", someVar, otherVar );

Da benutzerdefinierte Makros problemlos geändert werden können, um bedarfsabhängig mehr oder auch weniger Informationen an bestimmte Ziele zu senden, kann sich dieser Ansatz insbesondere bei steigenden Debuganforderungen als nützlich erweisen.

Siehe auch

Weitere Ressourcen

CRT-Debugverfahren