给定以下代码片段:
void test(int var)
{
Q_UNUSED(var);
#ifdef SOMETHING
printf("%d",var);
//do something else with var...
#endif
}
如果我在某种情况下(例如上面的示例中)实际使用“var”变量,那么“Q_UNUSED”宏是否会有任何效果,或者当我抑制未使用变量的编译器警告时完全没有效果?
到目前为止,我观察到它没有效果,但我想确保一下。
在许多情况下(例如仅将简单变量传递给宏),不需要。该定义在qglobal.h
中:
# define Q_UNUSED(x) (void)x;
为了禁用未使用变量警告,您可以在此宏之后使用该变量而不会出现任何问题。
但是,如果您将表达式或其他内容传递给宏,并且编译器必须评估该表达式,则可能会有副作用† 。
int
,那么它可能具有副作用。这是一个值的无条件加载。或者是一个转换运算符的无条件调用。x
可能是原子型,所以这将设置一个内存栅栏。实际上,一些编译器甚至在简单情况下就已知于这个确切的表达式生成虚假代码。 - Swift - Friday Pie代码应该没有副作用,但在 MSVC 上有时会产生无用的 memcpy 指令。
最简单的例子是使用 volatile
。可能还有其他情况:https://developercommunity.visualstudio.com/t/visual-c-generates-terrible-code-when-struct-conta/650789
Qt的方法是通过将其作为没有效果的表达式的一部分来抑制警告。有点类似。旧编译器具有不可移植的方式来标记未使用的参数或临时抑制警告的不可移植的方式。另一方面,一些最新的编译器会生成关于什么也不做的语句的诊断消息。
现代C++有一个替代方案。但是,如果在头文件中使用,可能会干扰元对象编译器。
((void)(expression));
的东西。) - user529758var
以使任何后续使用变得模糊不清吗?extern qUnusedType var;
- MSalters[[maybe_unused]]
,而没有让您标记控制流之后不想使用变量的点,并让编译器捕获它。) - HostileFork says dont trust SE