Отладка печати макроса в C? - PullRequest
       31

Отладка печати макроса в C?

24 голосов
/ 21 декабря 2009

в C, как правильно определить макрос типа printf, который будет печататься только тогда, когда определен символ DEBUG?

#ifdef DEBUG
#define DEBUG_PRINT(???) ???
#else
#define DEBUG_PRINT(???) ???
#endif

где ??? где я не уверен, что заполнять

Ответы [ 6 ]

37 голосов
/ 21 декабря 2009

Я видел эту идиому изрядно:

#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 в макросах.

20 голосов
/ 21 декабря 2009
#ifdef DEBUG
#define DEBUG_PRINT(...) do{ fprintf( stderr, __VA_ARGS__ ); } while( false )
#else
#define DEBUG_PRINT(...) do{ } while ( false )
#endif
17 голосов
/ 21 декабря 2009

Что-то вроде:

#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
14 голосов
/ 08 декабря 2014

Спасибо, 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

Протестировано с последним лязгом, например

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
2 голосов
/ 16 декабря 2013

Используйте разные подписи DEBUG_PRINT, они не должны быть одинаковыми, например:

#ifdef DEBUG
#define DEBUG_PRINT printf
#else
#define DEBUG_PRINT(...)
#endif

таким образом, в режиме отладки вызов DEBUG_PRINT будет заменен на printf. При выпуске он будет игнорировать все аргументы, использованные ранее.

Надеюсь, это поможет.

2 голосов
/ 21 ноября 2012

Вы можете просто использовать:

#ifdef DEBUG
    #define DEBUG_PRINT printf
#else
    #define DEBUG_PRINT
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...