如果未定义则忽略宏
Ignore macro if it is not defined
我在某些 C 文件中使用了以下宏:
DBGL_LOG_INFO(DBGL_UART_LOG_ENABLED, "UART is initialized");
如果定义 LOG_UART_ENABLED 为真,宏将调用我的日志记录模块。
如果 define 为 false,则不会编译日志代码,因此不会影响我在发布版本中的常规程序代码。
但是现在,我遇到了以下问题:
确实包含此宏调用的 C 文件也应该用于另一个不存在日志模块的项目。所以定义 DBGL_UART_LOG_ENABLED 在另一个项目中也不存在。
当然,当我在项目中使用这段代码编译文件时,出现以下错误:
'DBGL_UART_LOG_ENABLED' undeclared (first use in this function); did you mean '...'?
如果缺少宏和定义,是否可以告诉编译器应该忽略这段代码?
提前致谢。
这就是为什么这样的代码通常写成
#ifdef DBGL_UART_LOG_ENABLED
/* do stuff with DBGL_UART_LOG_ENABLED */
#endif
有条件地定义宏。例如,下面是一个常见的模式:
#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
这将宏定义为一个包含其参数的空块。这样,您可以继续在代码中使用宏而不影响输出。
我在某些 C 文件中使用了以下宏:
DBGL_LOG_INFO(DBGL_UART_LOG_ENABLED, "UART is initialized");
如果定义 LOG_UART_ENABLED 为真,宏将调用我的日志记录模块。 如果 define 为 false,则不会编译日志代码,因此不会影响我在发布版本中的常规程序代码。
但是现在,我遇到了以下问题: 确实包含此宏调用的 C 文件也应该用于另一个不存在日志模块的项目。所以定义 DBGL_UART_LOG_ENABLED 在另一个项目中也不存在。
当然,当我在项目中使用这段代码编译文件时,出现以下错误:
'DBGL_UART_LOG_ENABLED' undeclared (first use in this function); did you mean '...'?
如果缺少宏和定义,是否可以告诉编译器应该忽略这段代码?
提前致谢。
这就是为什么这样的代码通常写成
#ifdef DBGL_UART_LOG_ENABLED
/* do stuff with DBGL_UART_LOG_ENABLED */
#endif
有条件地定义宏。例如,下面是一个常见的模式:
#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
这将宏定义为一个包含其参数的空块。这样,您可以继续在代码中使用宏而不影响输出。