Jag får varningar i ditt exempel när _DEBUG inte är definierat. Eftersom du bara sätter TRACE till "" så blir argumenten kvar, dvs TRACE("test: %d", 42); ger att kompilatorn ser ("test: %d", 42); men det beror säkert på kompilator och varningsnivå.
Jag brukar använda följande konstruktion som jag kopierat någonstans ifrån:
Kod: Markera allt
#ifdef _DEBUG
#define TRACE(f, ...) \
do { fprintf(stderr, "%s: " f, __FUNCTION__ , ## __VA_ARGS__ ); } while(0)
#else
#define TRACE(f, ...) \
do { } while(0)
#endif
Trivialt lägga till FILE, LINE osv vad man nu vill ha.
fprintf(stderr får så klart bytas ut mot något printf-likande du har i din miljö.
"do {} while (0)" ser till att programflödet inte ändras när man slår på och av macrot, om man tex har en if-sats och att saker stämmer med semi-colon.
Konstruktionen "%s: " f utnyttjar att två strängkonstanter intill varandra slås ihop för att bygga formatsträngen.
## __VA_ARGS__ är eventuellt gcc-specifikt och måste vad jag förstår skrivas som bara __VA_ARGS__ för att vara ISO C99 men då kommer macro:t inte att fungera med bara ett argument, dvs TRACE("foo") är inte längre ok.