Come risposta al vostro problema si può anche semplicemente richiamare il compilatore come:
cc -c -DDEBUG=1
o
cc -c -DDEBUG=0
È necessario eliminare il "define DEBUG 1/0 "nei tuoi file - o sostituirlo con:
#ifndef DEBUG
#define DEBUG 0
#endif
Ecco quello che sto usando (sintassi GCC):
creare un Debug.h file con il seguente contenuto e includerlo in ogni file C:
#ifdef DEBUG
extern FILE *dbgf;
#define D_MIN 0x00010000 // Minimum level
#define D_MED 0x00020000 // Medium level
#define D_MAX 0x00040000 // Maximum level
#define D_FLUSH 0x00080000 // Usefull by a program crash
#define D_TRACE 0x00100000
#define D_1 0x00000001
...
#define D(msk, fmt, args...) if(msk & dbgmsk) { fprintf(dbgf, "%s:",__FUNCTION__); fprintf(dbgf, fmt, ## args); if(msk & D_FLUSH) fflush(dbgf); }
#define P(msk, fmt, args...) if(msk & dbgmsk) { fprintf(dbgf, fmt, ## args); if(msk & D_FLUSH) fflush(dbgf); }
#else
#define D(msk, fmt, args...)
#define P(msk, fmt, args...)
#endif
dbgmsk è variabile, che può essere globale (intero programma) o locale/statico e deve essere inizializzato un avvio. È possibile definire diverse opzioni per l'intero programma o per ciascun modulo. Questo è migliore e più flessibile della versione con la variabile di livello.
Es. module1.c:
#include "debug.h"
static int dbgmsk; // using local dbgmsk
module1_setdbg(int msk) { dbgmsk = msk; D(D_TRACE,"dbgmsk1=%x\n", dbgmsk); }
foo1() { P(D_1, "foo1 function\n");
....
}
foo2() {}
...
foo3.c
#include "debug.h"
extern int dbgmsk; // using global dbgmsk
Es. main:
#include "debug.h"
FILE *dbgf;
int dbgmsk = 0; // this is the global dbgmsk
int main() {
dbgf = stderr; // or your logfile
dbgmsk = D_MIN;
module1_setdbg(D_MIN|D_MED|D_TRACE|D_1);
....
}
Sto anche memorizzando tutte le variabili dbgmsk in un file di testo di configurazione che viene letto all'avvio del programma.
+1. Questo è il modo migliore per farlo. – Brian
Non è 'gcc -DDEBUG' invece di' -dDEBUG'? –
@Alan: buon punto! –