Como una respuesta a su problema también se puede simplemente invocar el compilador como:
cc -c -DDEBUG=1
o
cc -c -DDEBUG=0
debe eliminar el "definen DEBUG 1/0 "en sus archivos - o reemplácelo por:
#ifndef DEBUG
#define DEBUG 0
#endif
Aquí es lo que estoy utilizando (sintaxis GCC):
crear un Debug.h archivo con el siguiente contenido e incluirlo en cada archivo 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 es variable, que puede ser global (todo el programa) o local/estática y debe inicializarse un inicio. Puede definir varias opciones para todo el programa o para cada módulo. Esto es mejor y más flexible que la versión con la variable de nivel.
Ej. 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
Ex. principal:
#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);
....
}
También estoy almacenar todas las variables dbgmsk en un archivo de texto de configuración que se lee al inicio del programa.
+1. Esta es la mejor manera de hacerlo. – Brian
¿No es 'gcc -DDEBUG' en lugar de' -dDEBUG'? –
@ Alan: ¡Buen punto! –