Q_UNUSED有任何副作用吗?

33

给定以下代码片段:

void test(int var)
{
     Q_UNUSED(var);
#ifdef SOMETHING
     printf("%d",var);
     //do something else with var...
#endif
}

如果我在某种情况下(例如上面的示例中)实际使用“var”变量,那么“Q_UNUSED”宏是否会有任何效果,或者当我抑制未使用变量的编译器警告时完全没有效果?

到目前为止,我观察到它没有效果,但我想确保一下。


1
只需查看其文档。如果没有文档,则阅读其定义。(提示:它可能没有任何文档。它绝对不可能使变量“无法使用”。我猜这是类似于 ((void)(expression)); 的东西。) - user529758
@H2CO3:它不能重新声明var以使任何后续使用变得模糊不清吗? extern qUnusedType var; - MSalters
2
@H2CO3:没错,它并不是那么神奇。 - László Papp
可能是为什么将未使用的返回值转换为void?的重复问题。 - Mikhail
我在CodeReview SE上发布了一个“带有牙齿的UNUSED”(未使用但有用注释)... 供那些对实际破坏数据的想法感兴趣的人使用。 (虽然破坏数据并不理想,但是即使在标准C++注释中,未使用注释的无用性仍然存在,这让人困惑,因为它们在参数定义上使用了[[maybe_unused]],而没有让您标记控制流之后不想使用变量的点,并让编译器捕获它。) - HostileFork says dont trust SE
3个回答

44

在许多情况下(例如仅将简单变量传递给宏),不需要。该定义在qglobal.h中:

#  define Q_UNUSED(x) (void)x;

为了禁用未使用变量警告,您可以在此宏之后使用该变量而不会出现任何问题。

但是,如果您将表达式或其他内容传递给宏,并且编译器必须评估该表达式,则可能会有副作用


6
我唯一能看到的副作用就是如果你从Qt切换到其他框架,需要花费移植的精力,但这并不是大问题,因为无论如何你都会遇到更多问题。 - László Papp
@LászlóPapp 如果我们假设参数可以是“任何东西”,而不仅仅是一个无聊的int,那么它可能具有副作用。这是一个值的无条件加载。或者是一个转换运算符的无条件调用。x 可能是原子型,所以这将设置一个内存栅栏。实际上,一些编译器甚至在简单情况下就已知于这个确切的表达式生成虚假代码。 - Swift - Friday Pie

1

0

Qt的方法是通过将其作为没有效果的表达式的一部分来抑制警告。有点类似。旧编译器具有不可移植的方式来标记未使用的参数或临时抑制警告的不可移植的方式。另一方面,一些最新的编译器会生成关于什么也不做的语句的诊断消息。

现代C++有一个替代方案。但是,如果在头文件中使用,可能会干扰元对象编译器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接