Częścią problemu z tego rodzaju funkcjonalnością jest to, że często wymaga on makr variadycznych .Zostały one ustandaryzowane dość niedawno (C99), a wiele starych kompilatorów C nie obsługuje standardu lub ma swoje własne specjalne dzieło wokół.
Poniżej znajduje się nagłówek debugowania napisałem, że ma kilka ciekawych funkcji:
- Obsługuje C99 i C89 składnia makr debugowania
- Włącz/Wyłącz wyjście na podstawie argumentu funkcji
- wyjściowe do pliku deskryptora (file io)
Uwaga: Z jakiegoś powodu miałem niewielkie problemy z formatowaniem kodu.
#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 obsługuje funkcję zmiennej liczbie argumentów, że nie obsługuje zmiennej liczbie argumentów makra. Edycja: My bad: Obsługa makr variadic została wprowadzona w Visual C++ 2005. – hyperlogic
Zobacz także [C '# define' makro do drukowania debugowania] (https://stackoverflow.com/questions/1644868/c-define-macro- -debug-printing). Zwróćcie uwagę w szczególności, że ogólnie najlepiej jest upewnić się, że kompilator kompiluje (ale optymalizuje) kod z makra debugowania, tak że kod jest zawsze sprawdzany, a zatem zawsze poprawny. W przeciwnym razie bit-rot można ustawić i po ponownym uaktywnieniu makra debugowania dekadę później okaże się, że nie kompiluje się. –