【问题标题】:Defining a Conditional print macro in C [duplicate]在 C 中定义条件打印宏 [重复]
【发布时间】:2021-05-31 12:37:50
【问题描述】:

我想要一个有条件的打印宏,我可以根据是否定义了宏来打开或关闭它,例如#define DEBUG。我的第一个想法是:

#define DEBUG_PRINT(...) #ifdef DEBUG printf(__VA_ARGS__) #endif

但这并不完全有效,我在尝试时收到以下错误:

pc.c:16:24: error: '#' is not followed by a macro parameter
#define DEBUG_PRINT(...) #ifdef DEBUG printf(__VA_ARGS__) #endif

什么是定义类似DEBUG_PRINT 宏的有效方法,该宏在打开布尔值时打印?

【问题讨论】:

    标签: c


    【解决方案1】:

    执行此操作的规范方法是:

    #ifdef DEBUG
    #define DEBUG_PRINT(...) printf(__VA_ARGS__)
    #else
    #define DEBUG_PRINT(...)
    #endif
    

    如果您需要/想要执行多个语句:

    #define DEBUG_PRINT(...) do { printf(__VA_ARGS__); xxx; yyy; } while (0)
    

    另请参阅:do { ... } while (0) — what is it good for?

    最后,您可能应该更喜欢 fprintf(stderr, __VA_ARGS__) 而不是只使用 printf 进行调试。

    【讨论】:

    • 谢谢,使用 do... 与仅使用 printf(__VA_ARGS__) 相比有什么优势——两者似乎都对我有用,而且只是一个声明,对吧?
    • @David542 嗯,是的,我只是出于习惯而包装了它。如果它只是一个函数调用,你可以避免它。我会更新答案。
    • 谢谢,一旦允许,我会接受的。为什么建议使用fprintf 进行调试?如果需要,可以将其发送到日志文件或其他内容吗?
    • @David542 主要原因是您通常应该更喜欢调试输出到stderr 而不是stdout(这是普通的printf 输出)。这是因为标准错误没有被缓冲,所以你一打印就可以看到输出(即使你没有在最后添加换行符),而且正如你所说的,它可以很容易地分开(例如通过管道传输到日志中)文件),以便您可以区分程序的真实输出和调试输出。
    • 两种情况都应该有一个do...while(0) 或类似的,以便不根据调试是否激活而改变控制流
    猜你喜欢
    • 2019-09-10
    • 2012-03-16
    • 2011-03-30
    • 2014-08-14
    • 2014-10-01
    • 1970-01-01
    • 2023-03-13
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多