[英]How to elegantly fix this unused variable warning?
我工作的一些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);
但是,我觉得这不是一个干净和可读的解决方案。 有没有更好的办法? 请注意,出于性能原因,如果未定义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)
的实际类型。 这是为了防止VLA触发评估 。 (void)
显式忽略(x)
和sizeof
的结果,因此不会出现“未使用的值”警告。 如果我正确理解你的问题,你可以做类似的事情
#ifdef DEBUG
.
.
#else
#define CHECK(expr) ((void)(expr))
#endif /* DEBUG */
摆脱警告。
使用此解决方案,不需要中间变量。
#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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.