GCC中的断言和未使用的局部变量警告不能很好地混合?

Joh*_*ski 10 c c++ gcc g++

我在GCC中遇到了未使用的局部变量警告问题.

通常我的代码看起来像这样:

bool success = foo();
assert(success);
Run Code Online (Sandbox Code Playgroud)

这适用于调试版本.然而,在发布中,断言编译为空,GCC给了我一个警告.

解决这个问题的最佳方法是什么?bool success =用#ifdef 包装似乎不是一个很好的解决方案......

Jar*_*Par 8

我可能会定义一个特定于此场景的宏

#ifndef NDEBUG
#define verify(expression) assert(expression)
#else
#define verify(expression) expression
#endif
Run Code Online (Sandbox Code Playgroud)

我更喜欢这种方法而不是使用局部变量,因为它不会使用仅有条件存在的值污染方法.

总的来说,我发现在我的项目中有两组宏是非常有帮助的

  • assertXXX:仅调试执行
  • verifyXXX:零售+调试执行

  • 这很好,但有一个缺点,即如果`expression`包含函数调用,它们可能不会被优化掉. (2认同)
  • @Jared:这是我的观点.如果您不需要调用函数而不是计算将要声明的值,该怎么办?另外,在GCC中至少使用`-Wall`,一个独立的表达式(因为你进入非调试模式)会引发警告/错误,这会将我们带回到我们开始的地方! (2认同)

Mic*_*urr 8

我用的是宏

#define UNUSED(x) ((void)(x))
Run Code Online (Sandbox Code Playgroud)

像这样使用:

UNUSED(success);
Run Code Online (Sandbox Code Playgroud)

宏以使警告静音并记录变量未使用的事实(至少在某些构建中)是故意/确定的.


Mar*_*som 6

不了解GCC,但这一直在Microsoft Visual C++中有效:

(void) success;
Run Code Online (Sandbox Code Playgroud)

它引用变量而不实际执行任何操作.