#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