代码之家  ›  专栏  ›  技术社区  ›  runner

宏详细定义

  •  1
  • runner  · 技术社区  · 4 年前

    我有以下代码片段

    #define DEBUG_PRINT( x, fmt, args... ) if (DEBUG_##x || x == 0) {fprintf(fmt, ##args);} else;
    

    其中x是详细程度。

    如果详细度x为0,并且定义了相应的调试###x,我希望执行fprint语句

    编译时,由于DEBUG_1未定义而引发错误。

    如果没有定义DEBUG_1,我的用例是跳过fprint语句。帮我破解这个逻辑

    1 回复  |  直到 4 年前
        1
  •  0
  •   HolyBlackCat    4 年前

    你甚至不需要一个普通的 if .您可以使用预处理器完全删除 printf 如果未定义宏:

    #define CAT(x, y) CAT_(x, y)
    #define CAT_(x, y) x##y
    
    #define TRUTHY_X ,
    #define TRUTHY_1X ,
    
    #define RUN_IF(cond, then) RUN_IF_A(CAT(CAT(TRUTHY_, cond), X) then,)
    #define RUN_IF_A(...) RUN_IF_B(__VA_ARGS__)
    #define RUN_IF_B(cond, then, ...) then
    
    #define DEBUG_PRINT(x, fmt, ...) RUN_IF(CAT(DEBUG_,x),printf(fmt, ##__VA_ARGS__));
    

    这是假设 DEBUG_x 定义为空字符串或 1 .这还假设 DEBUG_ 还有一些事情没有定义。

    我没有增加特殊待遇 x == 0 ,但这可以通过 #define DEBUG_0 .