【问题标题】:Ignore macro if it is not defined如果未定义宏,则忽略它
【发布时间】:2020-12-10 01:58:51
【问题描述】:

我在一些 C 文件中使用了以下宏:

DBGL_LOG_INFO(DBGL_UART_LOG_ENABLED, "UART is initialized");

如果定义的 LOG_UART_ENABLED 为真,则宏调用我的日志记录模块。 如果定义为假,日志代码将不会被编译,因此不会影响我在发布构建中的常规程序代码。

但是现在,我遇到了以下问题: 确实包含此宏调用的 C 文件也应在不存在日志模块的另一个项目中使用。所以定义 DBGL_UART_LOG_ENABLED 在这个其他项目中也不存在。

当然,当我在项目中使用此代码编译文件时,会出现以下错误:

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

如果缺少宏和定义,是否可以告诉编译器忽略此代码?

提前谢谢你。

【问题讨论】:

    标签: c compiler-errors preprocessor


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 2014-01-02
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多