ASSERT bliver defineret til to forskellige ting afhængigt af om debug er defineret.
Så hvis du har:
#define DEBUG
#include <iostream>
using namespace std;
#ifndef DEBUG
#define TRACE(x)
#else
#define TRACE(x) cout << x << " in line " << __LINE__ << " in file " << __FILE__ << std::endl
#endif
int main()
{
int x = 4;
TRACE(x);
}
Kan du få main til at udskrive en besked eller foretage intet afhængigt af om DEBUG er defineret, uden at ændre i main.
Det kan være praktisk at have en masse trace output når man udvikler, men brugeren af programmet vil nok helst ikke se på det output. Når ud så udvikler sætter du en gang for alle DEBUG og du får dit trace og når du frigiver til kunden definerer du ikke DEBUG og trace statements bliver til ingenting. Du kunne opnå det samme med et flag, og en if(...) men det vil netop fylde i koden, din ASSERT fylder intet hvis ikke DEBUG er defineret.
Der findes en debug macro kaldet assert i assert.h, der gør stort set det samme som din ASSERT, den styrres af NDEBUG på samme (modsatte) måde som din DEBUG.
Bemærk i øvrigt at iostream.h ikke er en standard header-fil; brug iostream og skriv using namespace std; som i mit eksempel.