c – 如何优雅地修复这个未使用的变量警告?

我正在研究一些在设置DEBUG标志时执行大量错误报告和日志记录的C代码,这有时会在未设置DEBUG标志的情况下生成未使用的变量警告.
#ifdef DEBUG
#define CHECK(expr) foo(expr)
#else
#define CHECK(expr)
#endif /* DEBUG */

int x = bar(a,b,c); /* bar has to be called for both DEBUG begin defined and undefined */ 
CHECK(x == SOME_VALUE); /* Produces an "unused variable" warning if DEBUG is undefined

编辑:只是一点提醒(不确定它是否有任何结果):CHECK宏的参数是一个表达式,而不是单个变量.

对于这种模式,摆脱未使用的变量警告的最佳方法是什么?

我尝试了什么:

#ifdef DEBUG
int x = bar(a,c);
#else
bar(a,c);
#endif
CHECK(x == SOME_VALUE);

然后,避免将调用写入bar(在实际调用中更复杂)两次:

#ifdef DEBUG
int x = 
#endif
bar(a,c);
CHECK(x == SOME_VALUE);

但是,我觉得这不是一个干净,可读的解决方案.有没有更好的办法?请注意,出于性能原因,如果未定义DEBUG,则CHECK(expr)宏不应生成任何代码(编辑:因此,不应评估expr).

有没有比我上面概述的方式更优雅的方式?

解决方法

#ifdef DEBUG
    #define CHECK(x) x
#else
    #define CHECK(x) ((void)sizeof((void)(x),0))
#endif

我认为这解决了所有可能的问题:

> sizeof确保表达式根本不被评估,因此它的副作用不会发生.这与仅调试构造的常见行为一致,例如assert.
>((x),0)使用逗号运算符来吞下(x)的实际类型. This is to prevent VLAs from triggering evaluation.>(void)显式忽略(x)和sizeof的结果,因此不会出现“未使用的值”警告.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...