Игнорировать макрос, если он не определен

#c #compiler-errors #preprocessor

#c #ошибки компилятора #препроцессор

Вопрос:

Я использую следующий макрос в некоторых файлах C:

 DBGL_LOG_INFO(DBGL_UART_LOG_ENABLED, "UART is initialized");
 

Макрос вызывает мой модуль ведения журнала, если значение define LOG_UART_ENABLED равно true.
Если define равно false, код ведения журнала не будет скомпилирован и, следовательно, не повлияет на мой обычный программный код в сборке выпуска.

Но теперь у меня следующая проблема: файлы C, которые содержат этот вызов макроса, также должны использоваться в другом проекте, где модуль журнала не существует. Таким образом, define DBGL_UART_LOG_ENABLED также не существует в этом другом проекте.

Конечно, когда я компилирую файл с этим кодом в проекте, я получаю следующую ошибку:

 'DBGL_UART_LOG_ENABLED' undeclared (first use in this function); did you mean '...'?
 

Возможно ли сообщить компилятору, что этот код следует игнорировать, если макрос и определения отсутствуют?

Заранее благодарю вас.

Ответ №1:

Условно определите макрос. Например, следующий типичный шаблон:

 #ifndef DBGL_UART_LOG_ENABLED
#   define DBGL_UART_LOG_ENABLED 0
#endfif
 

И вам, вероятно, тоже нужно справиться DBGL_LOG_INFO :

 #ifndef DBGL_LOG_INFO
#   define DBGL_LOG_INFO(...) do {} while (false)
#endif
 

Это определяет макрос как пустой блок, который проглатывает свои аргументы. Таким образом, вы можете продолжать использовать макрос в коде, не влияя на результат.

Ответ №2:

Именно поэтому такой код обычно пишется как

 #ifdef DBGL_UART_LOG_ENABLED

/* do stuff with DBGL_UART_LOG_ENABLED */

#endif