【问题标题】:Macro Verbosity definition宏详细度定义
【发布时间】:2020-10-20 22:04:22
【问题描述】:

我有以下代码 sn-p

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

其中 x 是详细级别。

如果详细程度 x 为 0 并且定义了相应的 DEBUG_##x,我想执行 fprint 语句

编译时抛出错误,因为 DEBUG_1 未定义。

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

【问题讨论】:

    标签: c macros c99


    【解决方案1】:

    您甚至不需要普通的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解决。

    【讨论】:

    • 这个逻辑似乎连编译都没有出错。如果你想要我试过的代码,我可以在这里添加。
    • @runner GCC 和 Clang do run it。 MSVC 出错,但已知它们有一个不符合要求的预处理器。你用什么编译器?是的,代码会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2011-03-08
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多