首页 > 解决方案 > 用于定义宏集的 C 宏

问题描述

我有一系列可以扩展为函数调用或无操作语句的调试宏。

#define NOOP                   do {} while(0)

#ifdef DEBUG
  #define DEBUG_LOG(a)         log(a)
  #define DEBUG_LOG_HEX(a, b)  log_hex(a, b)
#else
  #define LOG(a)               NOOP
  #define LOG_HEX(a, b)        NOOP
#endif

我想要一个可以快速定义这些全局宏的模块特定版本的宏,可以通过额外的#define 打开和关闭。我想在宏观层面上做到这一点,因为我处于代码大小极其受限的环境中。

我知道这是不合法的,但我希望它表明我希望实现的目标:

#define MODULE_DEBUG(MNAME)                      \\
  #ifdef ##MNAME_DEBUG                           \\
    #define ##MNAME_DEBUG_LOG     DEBUG_LOG      \\
    #define ##MNAME_DEBUG_LOG_HEX DEBUG_LOG_HEX  \\
  #else                                          \\
    #define ##MNAME_DEBUG_LOG     NOOP           \\
    #define ##MNAME_DEBUG_LOG_HEX NOOP           \\
  #endif

作为示例用法,这将调用 log("foo")。但是如果没有设置 DEBUG,或者没有设置 BLE_DEBUG,它将 NOOP。

#define DEBUG
#define BLE_DEBUG

MODULE_DEBUG(BLE);

BLE_DEBUG_LOG("foo");

标签: cmacros

解决方案


推荐阅读