Часть проблемы с такой функциональностью заключается в том, что для этого требуется variadic macros.Они были стандартизованы сравнительно недавно (C99), а множество старых компиляторов C не поддерживают стандарт или имеют свою собственную специальную работу .
Ниже отладочный заголовок я написал, что имеет несколько интересных функций:
- Поддерживает C99 и C89 синтаксис для отладки макросов
- Включение/выключение вывод на основе аргумента функции
- Вывод в файл дескриптора (файл io)
Примечание: по некоторым причинам у меня были некоторые проблемы с форматированием кода.
#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 поддерживает функции VARIADIC, он не поддерживает VARIADIC макросы. Edit: My bad: поддержка Variadic макросов была представлена в Visual C++ 2005. – hyperlogic 2008-08-18 22:15:41
См. Также макрос C# # define для отладочной печати] (https://stackoverflow.com/questions/1644868/c-define-macro-for -debug-печать). Обратите внимание, в частности, что лучше всего обеспечить компиляцию (но оптимизирует) код из макроса отладки, так что код всегда проверяется и, следовательно, всегда корректен. В противном случае бит-гниль может установить и когда вы повторно активируете макрос отладки через десятилетие, вы обнаружите, что он больше не компилируется. – 2016-04-09 23:18:05