Parte del problema con este tipo de funcionalidad es que a menudo requiere macros variadic.Estos fueron estandarizados bastante recientemente (C99), y muchos de los compiladores de C antiguos no son compatibles con el estándar, o tienen su propio trabajo especial alrededor.
A continuación se muestra una cabecera de depuración escribí que tiene varias características interesantes:
- Soporta C99 y C89 sintaxis para macros de depuración
- salida de habilitación/Desactivar basado en argumento de la función
- salida a un archivo descriptor (archivo io)
Nota: Por alguna razón tuve algunos problemas con el formato del código.
#ifndef _DEBUG_H_
#define _DEBUG_H_
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include "stdarg.h"
#include "stdio.h"
#define ENABLE 1
#define DISABLE 0
extern FILE* debug_fd;
int debug_file_init(char *file);
int debug_file_close(void);
#if HAVE_C99
#define PRINT(x, format, ...) \
if (x) { \
if (debug_fd != NULL) { \
fprintf(debug_fd, format, ##__VA_ARGS__); \
} \
else { \
fprintf(stdout, format, ##__VA_ARGS__); \
} \
}
#else
void PRINT(int enable, char *fmt, ...);
#endif
#if _DEBUG
#if HAVE_C99
#define DEBUG(x, format, ...) \
if (x) { \
if (debug_fd != NULL) { \
fprintf(debug_fd, "%s : %d " format, __FILE__, __LINE__, ##__VA_ARGS__); \
} \
else { \
fprintf(stderr, "%s : %d " format, __FILE__, __LINE__, ##__VA_ARGS__); \
} \
}
#define DEBUGPRINT(x, format, ...) \
if (x) { \
if (debug_fd != NULL) { \
fprintf(debug_fd, format, ##__VA_ARGS__); \
} \
else { \
fprintf(stderr, format, ##__VA_ARGS__); \
} \
}
#else /* HAVE_C99 */
void DEBUG(int enable, char *fmt, ...);
void DEBUGPRINT(int enable, char *fmt, ...);
#endif /* HAVE_C99 */
#else /* _DEBUG */
#define DEBUG(x, format, ...)
#define DEBUGPRINT(x, format, ...)
#endif /* _DEBUG */
#endif /* _DEBUG_H_ */
Stu, MSVC ¿apoya funciones variadic, que no soporta macros variadic. Editar: Lo malo: la compatibilidad con macros variadic se introdujo en Visual C++ 2005. – hyperlogic
Véase también la macro [C '# define' para la impresión de depuración] (https://stackoverflow.com/questions/1644868/c-define-macro-for -debug-printing). Tenga en cuenta, en particular, que generalmente es mejor asegurarse de que el compilador compila (pero optimiza) el código de una macro de depuración, de modo que el código siempre se comprueba y, por lo tanto, siempre es correcto. De lo contrario, bit-rot puede establecerse y cuando se reactiva la macro de depuración una década más tarde, se encuentra que ya no se compila. –