simulador para onlinegdb online lĂ­nea linea compiler compile compilador c debugging

c - para - #define DEBUG 1



shell++ c (8)

Estoy tratando de tener un modo de depuración activado así que si

#define DEBUG 1

Quiero imprimir algunos valores variables y si

#define DEBUG 0

Los quiero fuera.

El problema es que tengo muchos archivos de implementación y quiero que esta variable DEBUG esté disponible para todo el proyecto. En este momento necesito editar la variable DEBUG en foo1.c, foo2.c, foo3.c, que parece tediosa y propensa a errores, y debe haber una mejor manera. ¿Alguna sugerencia?


Al compilar, debería poder especificar una opción para su compilador. Por ejemplo, puede llamar a GCC con la opción -DDEBUG .

En este caso, sería mejor usar:

#ifdef DEBUG #endif

o:

#if defined(DEBUG) #endif

Si esta no es la forma en que lo estás haciendo ahora. Me sorprende que no tenga un archivo de encabezado global para su proyecto. Algo a lo largo de las líneas de:

#ifdef DEBUG #undef DEBUG #endif #define DEBUG 1

en un archivo llamado "debug.h". En sus programas de C, puede incluir esto utilizando #include "debug.h"


Coloque "#define DEBUG" en "debug.h" y #include ese archivo de encabezado en cada archivo * .c.


Como dice @ person-b, especifique esta definición como una opción de compilador, por ejemplo, -D DEBUG

Tenga en cuenta que para simplificar esto, debe cambiar la prueba en su código de:

#if DEBUG

a:

#ifdef DEBUG

De esta manera, no tiene que preocuparse por especificar un valor de 0 o 1, sino que puede confiar en que se defina o no.


Como respuesta a su problema, también puede simplemente invocar el compilador como:

cc -c -DDEBUG=1

o

cc -c -DDEBUG=0

Debe eliminar el "define DEBUG 1/0" en sus archivos, o reemplazarlo con:

#ifndef DEBUG #define DEBUG 0 #endif

Esto es lo que estoy usando (sintaxis GCC):

  • cree un archivo debug.h con el siguiente contenido e inclúyalo 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 (programa completo) o local / estático y debe iniciarse de forma inicial. 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.

Ex. módulo1.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 almacenando todas las variables dbgmsk en un archivo de texto de configuración que se lee al inicio del programa.


Intenta esto en su lugar.

En el primer archivo que tengas se incluirá:

#define DEBUG

Luego, cuando quieras tener un código de depuración, haz esto:

#ifdef DEBUG do some stuff #endif

Esto también evitará que su código de depuración lo convierta en código de lanzamiento.


Intente algo como lo sugiere Steve McConnel en la sección 6 del "Capítulo 8: Programación defensiva" de Code Complete 2 ... Agregue esto a su código:

#ifdef DEBUG #if (DEBUG > 0) && (DEBUG < 2) printf("Debugging level 1"); #endif #if (DEBUG > 1) && (DEBUG < 3) printf("Debugging level 2"); #endif #if (DEBUG > n-1) && (DEBUG < n) printf("Debugging level n"); #endif #endif

Luego, cuando compile, agregue este indicador (advertencia: esto podría depender del compilador):

-DDEBUG=m

O bien, tenga un encabezado global que defina este tipo de cosas, como otros han sugerido.


La sugerencia de samoz y Stephen Doyle para verificar la existencia de una definición de DEBUG en lugar de su valor es buena. Sin embargo, si realmente desea utilizar DEBUG = 0, así es como puede hacerlo: cada vez que defina el indicador DEBUG (es decir, en cada archivo), busque una definición existente:

#ifndef DEBUG #define DEBUG 1 #endif

Luego, cuando use la opción -DDEBUG = 0 con su compilador, la línea #define nunca se ejecutará.


Personalmente me gusta

#ifdef DEBUG #define IFDEBUG if(0)else #else #define IFDEBUG if(1)else #endif