【发布时间】:2016-09-21 13:30:34
【问题描述】:
我正在编写一些 C 代码,当设置了 DEBUG 标志时会执行大量错误报告和日志记录,当使用 DEBUG 标志不进行编译时,有时会产生 unused variable 警告设置。
#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, b, c);
#else
bar(a, b, c);
#endif
CHECK(x == SOME_VALUE);
然后,为了避免将调用写入bar(在实际调用中更复杂):
#ifdef DEBUG
int x =
#endif
bar(a, b, c);
CHECK(x == SOME_VALUE);
但是,我觉得这不是一个干净易读的解决方案。有没有更好的办法?请注意,出于性能原因,如果 DEBUG 未定义,CHECK(expr) 宏不应生成任何代码(编辑:,因此不应评估 expr)。
有没有比我上面概述的更优雅的方法?
【问题讨论】:
-
@yuhao 删除
compiler-warning标签有什么具体原因吗? -
也许你应该说:“CHECK(expr) 宏不应产生任何代码,但仍应评估 expr,换句话说,CHECK(bar(a,b,c) == someval) 必须导致 bar(a,b,c) 被调用。
-
@shodanex:我为什么要这样做?如果
DEBUG未定义,则不应计算表达式expr。 -
@mort,我的意思是你应该定义是否要评估 expr。
-
@shodanex:为了清楚起见,我对其进行了编辑,尽管我认为它实际上暗示了“如果 DEBUG 未定义,宏不应生成任何代码”
标签: c macros unused-variables