#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 DEBUGint x = bar(a,c);#elsebar(a,c);#endifCHECK(x == SOME_VALUE);
然后,避免将调用写入bar(在实际调用中更复杂)两次:
#ifdef DEBUGint x = #endifbar(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 – 如何优雅地修复这个未使用的变量警告?全部内容,希望文章能够帮你解决c – 如何优雅地修复这个未使用的变量警告?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)