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

时间:2016-05-24 11:07:52

标签: c macros unused-variables

我正在处理一些C代码,这些代码在设置DEBUG标志时会执行大量错误报告和记录,这有时会产生未使用的变量警告编译时未设置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, 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);

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

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

3 个答案:

答案 0 :(得分:7)

#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的结果,因此没有&#34;未使用的值&#34;出现警告。

答案 1 :(得分:4)

如果我理解你的问题,你可以做点什么

#ifdef DEBUG
.
.
#else
#define CHECK(expr) ((void)(expr))
#endif /* DEBUG */

摆脱警告。

答案 2 :(得分:0)

使用此解决方案,不需要中间变量。

#define DEBUG

#define DOCHECK(a) printf("DOCHECK %d\n", a)

#ifndef DEBUG
#define CHECK(a, b) a
#else
#define CHECK(a, b) do {int x = a; DOCHECK(x == b);} while (0)
#endif

int bar(int x, int y)
{
  return x+y;
}    

int main()
{
  CHECK(bar(2,3), 2+3);
  return 0;
}