我在GCC中遇到了未使用的局部变量警告问题。
通常我的代码看起来像这样:
bool success = foo();
assert(success);
这适用于调试版本。然而,在发布中,断言编译为空,GCC给了我一个警告。
解决此问题的最佳方法是什么?用#ifdef包装bool success =
似乎不是一个很好的解决方案......
答案 0 :(得分:8)
我可能会定义一个特定于此场景的宏
#ifndef NDEBUG
#define verify(expression) assert(expression)
#else
#define verify(expression) expression
#endif
我更喜欢这种方法而不是使用局部变量,因为它不会使用仅有条件存在的值污染方法。
总的来说,我发现在我的项目中有两组宏非常有用
答案 1 :(得分:8)
我使用宏
#define UNUSED(x) ((void)(x))
像这样使用:
UNUSED(success);
宏使警告静音并记录变量未使用的事实(至少在某些版本中)是故意的/确定。
答案 2 :(得分:6)
不了解GCC,但这在Microsoft Visual C ++中一直有效:
(void) success;
它引用变量而不实际执行任何操作。
答案 3 :(得分:1)
您可以使用variable attribute将其标记为可能未使用。
答案 4 :(得分:1)
您可以使用NDEBUG
宏,该宏在未使用断言时定义,例如:
#ifndef NDEBUG
bool success =
#endif
foo();
assert(success);
编辑:这将有效地“杀死”警告,因为#ifndef
将确保没有变量可以警告。
答案 5 :(得分:1)
这是一个稍微简洁的形式Lindydancer的solution,代价是定义一个帮助宏。这是辅助宏:
#ifndef NDEBUG
# define DEBUG_ONLY( ... ) __VA_ARGS__
#else
# define DEBUG_ONLY( ... )
#endif
然后就可以这样使用:
DEBUG_ONLY( bool success = ) foo();
assert( success );
答案 6 :(得分:0)
您可以使用特定于GCC的unused
属性。它通常被定义为一个简短的形式,很容易从非GCC编译器的代码中删除。