Q_UNUSED相对于省略参数名有什么好处?

3
使用Q_UNUSED宏与在函数中省略参数名称相比有哪些好处? Q_UNUSED版本:
void f(int x) {
    Q_UNUSED(x);
}

省略版本号:
void f(int) {
}

我认为有一些指导方针说明了为什么要使用它,但我在这里找不到任何关于它的内容。接下来的想法是,即使在任何标准(98、03、11、14、17)中省略变量名,编译器也不会报错,因此某一天省略可能不存在于标准中,但Qt为什么还要使用这个宏呢?如果它是无用的并且会增加出错的可能性,那为什么还要使用它呢?


2
在编写代码时,显示意图而非潜在的拼写错误,这样可以让任何人(包括自己半年后)阅读代码时都能理解。同时,通过在代码中保留参数名称,回答了“那个参数到底是什么”的问题。 - Richard Critten
1
@RichardCritten 内联注释也可以显示意图:void f(int /*x*/) { - Victor Polevoy
@RichardCritten 我的意思是:如果没有太大的区别,那么就是可以基于个人观点来决定的;但如果有很大的区别,那么就不能基于个人观点来决定。 - Victor Polevoy
5
考虑 void f(int x) { assert(x > 0); Q_UNUSED(x); },在此情况下,x 在调试模式下被使用,但在发布模式下未被使用。 - cpplearner
1
@RichardCritten 我不同意,答案似乎是基于观点的,但问题是合法的,因为它询问是否存在实际的好处/差异,以便我们可以回答是否有。 - ymoreau
显示剩余2条评论
1个回答

4

Q_UNUSED 可以防止编译器在多个未处理参数的情况下反应过度。此外,我们可以实例化一个对象,而不需要对其进行单个调用:

MyClass myObject;
Q_UNUSED(myObject)

对我来说最常见的情况是QMutexLocker:

void qtFunc()
{
   // and no other line of code in that function accesses `lock`
   QMutexLocker lock(&m_mutex);
   // it just protects this scope with some object shared with other threads
   Q_UNUSED(lock) // shut up, compiler
}

理论上(也许经常会出现这种情况),我们可以遇到类似的情况,当我们最初在堆栈上编写对象代码时,然后决定通过参数传递引用,而不是互斥锁,直到我们弄清楚它的最终用途。我个人不喜欢重新访问代码中这种不重要的“瞬间”来修复一些警告。因此,在代码未完成时,我会使用 Q_UNUSED 左右。

P.S. 当然,编译器发出“未使用变量”的警告这一事实是取决于编译器选项的。


1
在这种情况下,编译器不会(据我所知)发出警告。如果析构函数中有副作用,对象将被使用。 - Jaa-c
1
试试看。我的GCC可以。 :) - Alexander V
它以“未使用的变量”结束。在我们的大型项目中,我并不总是能够控制编译器选项。 - Alexander V

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