в C, каков правильный способ определения макроса printf, который будет печатать только при определении символа DEBUG?
#ifdef DEBUG
#define DEBUG_PRINT(???) ???
#else
#define DEBUG_PRINT(???) ???
#endif
где??? где я не уверен, что заполнить
в C, каков правильный способ определения макроса printf, который будет печатать только при определении символа DEBUG?
#ifdef DEBUG
#define DEBUG_PRINT(???) ???
#else
#define DEBUG_PRINT(???) ???
#endif
где??? где я не уверен, что заполнить
Я видел эту идиому в достаточной степени:
#ifdef DEBUG
# define DEBUG_PRINT(x) printf x
#else
# define DEBUG_PRINT(x) do {} while (0)
#endif
Используйте его как:
DEBUG_PRINT(("var1: %d; var2: %d; str: %s\n", var1, var2, str));
Дополнительные скобки необходимы, потому что некоторые старые компиляторы C не поддерживают var-args в макросах.
#ifdef DEBUG
#define DEBUG_PRINT(...) do{ fprintf( stderr, __VA_ARGS__ ); } while( false )
#else
#define DEBUG_PRINT(...) do{ } while ( false )
#endif
Что-то вроде:
#ifdef DEBUG
#define DEBUG_PRINT(fmt, args...) fprintf(stderr, fmt, ## args)
#else
#define DEBUG_PRINT(fmt, args...) /* Don't do anything in release builds */
#endif
Спасибо, mipadi, я также улучшил ваш DEBUG_PRINT с файловой информацией.
#define DEBUG 3
#if defined(DEBUG) && DEBUG > 0
#define DEBUG_PRINT(fmt, args...) fprintf(stderr, "DEBUG: %s:%d:%s(): " fmt, \
__FILE__, __LINE__, __func__, ##args)
#else
#define DEBUG_PRINT(fmt, args...) /* Don't do anything in release builds */
#endif
Протестировано с последним clang, например
int main(int argc, char **args) {
DEBUG_PRINT("Debugging is enabled.\n");
DEBUG_PRINT("Debug level: %d", (int) DEBUG);
}
выходы:
DEBUG: debug.c:13:main(): Debugging is enabled.
DEBUG: debug.c:14:main(): Debug level: 3
Вы можете просто использовать:
#ifdef DEBUG
#define DEBUG_PRINT printf
#else
#define DEBUG_PRINT
#endif
Используйте разные подписи DEBUG_PRINT, они не обязательно должны быть одинаковыми, например:
#ifdef DEBUG
#define DEBUG_PRINT printf
#else
#define DEBUG_PRINT(...)
#endif
таким образом в режиме отладки вызов DEBUG_PRINT будет заменен на printf. При выпуске он будет игнорировать все аргументы, используемые ранее.
Надеюсь, что это поможет.