#define LOG_MSG (...) для отладки - PullRequest
       3

#define LOG_MSG (...) для отладки

5 голосов
/ 02 августа 2010

Как работает следующий код?

#define ENABLE_DEBUG 1

#if ENABLE_DEBUG
    #define LOG_MSG printf
#else
    #define LOG_MSG(...)
#endif

Ответы [ 2 ]

9 голосов
/ 02 августа 2010

В зависимости от значения ENABLE_DEBUG, LOG_MSG либо определяется как псевдоним для printf(), либо определяется как недопустимый макрос.Подразумевается, что вы можете изменить значение на 0, чтобы отключить отладку.Это обычная техника, позволяющая легко переключаться между отладочными сборками, которые отображают множество выходных и выпусков, которые тихие.

#define LOG_MSG printf

Это делает его псевдонимом для printf().

#define LOG_MSG(...)    /* empty */

И это определяет его как пустой макрос.Обратите внимание, что здесь у него есть набор скобок, что означает, что макрос принимает параметры.Впоследствии у него ничего нет, что означает, что он расширяется до абсолютно ничего.И ... указывает, что этот макрос может принимать различное количество аргументов .Этот синтаксис является расширением C99, поэтому он может быть недоступен на старых компиляторах C.

LOG_MSG("file not found\n");

В результате вызов LOG_MSG() либо напечатает сообщение, либо ничего не сделает в зависимости от того, включено ли ведение журнала.

// If ENABLE_DEBUG is non-zero, a debugging printout:
printf("file not found\n");

// If ENABLE_DEBUG is zero, an empty statement:
;

В любом случае, кто бы ни создал этот макрос, он мог бы справиться лучше, заменив первое определение на другое с использованием синтаксиса ... (с которым он / она хорошо знаком), напечатавв stderr вместо stdout:

#define LOG_MSG(...) fprintf(stderr, __VA_ARGS__)
1 голос
/ 02 августа 2010

Используется препроцессор для изменения кода перед компиляцией. Если ENABLE_DEBUG определено как 1, всякий раз, когда препроцессор видит

LOG_MSG("something happened");

Он заменит его на

printf("something happened");

Если он определен как 0 или не определен, он заменит его ничем (как говорит другой только что опубликованный ответ).

...