В зависимости от значения 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__)