C++ 清洁方式消除“污染”;未使用的参数';小部件'&引用;QGraphicsItem::paint生成的警告

C++ 清洁方式消除“污染”;未使用的参数';小部件'&引用;QGraphicsItem::paint生成的警告,c++,qt,C++,Qt,QGraphicsItem::paint具有以下签名: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 当我创建自定义的QGraphicsItems时,我必须为这个函数提供一个实现。问题是。。。我从不需要使用选项和小部件参数,但我不能出于明显的原因删除它们。我总是看到以下编译器警告: 警告:未使用的参数“widget” 警告:未使用的参数“选项” 是否有适当的方法来消除

QGraphicsItem::paint
具有以下签名:

void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
当我创建自定义的
QGraphicsItem
s时,我必须为这个函数提供一个实现。问题是。。。我从不需要使用
选项
小部件
参数,但我不能出于明显的原因删除它们。我总是看到以下编译器警告:

警告:未使用的参数“widget”

警告:未使用的参数“选项”


是否有适当的方法来消除这些警告?我知道我可以通过在函数中提及未使用的参数来隐藏它们,但这是一个非常糟糕的解决方案,我想知道是否有更好的选项。

不要为未使用的参数提供参数名称。例如(我不确定您的“事件”指的是什么),要删除
警告:未使用的参数“选项”
,请将您的签名更改为:

void paint(QPainter *painter, const QStyleOptionGraphicsItem * /* unused */, QWidget *widget)

(就警告而言,
/*unused*/
标记是不必要的,但我发现它对人类读者很有用。)

您可以省略参数名来告诉编译器它没有被使用:

void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)

忽略参数名称:

void paint( ..., QWidget* ) {
或者使用Q_UNUSED宏:

void paint( ..., QWidget* widget ) {
    Q_UNUSED( widget )
    ...

使用Qt宏:
Q_UNUSED
要做到这一点

基本上有三种方法可以使UNUSED参数编译器警告静音:

显式强制转换未使用的参数以使其无效:

void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
           QWidget *widget)
{
    (void)option;
    (void)widget;
    // ...
}
此模式符合标准,并被程序员广泛理解。像GCC这样的编译器会看到参数被使用,因此不会发出警告,并且会优化这些行,因为它们不是ops(即没有效果)

或者,您可以使用Qt的宏:

对于GCC和其他编译器,它也扩展到
(void)
-cast模式,但它也可能包括为晦涩难懂的编译器提供的变通方法,而这还不够。例如,Qt 5.4.1将其定义为:

#if defined(Q_CC_RVCT)
template <typename T>
inline void qUnused(T &x) { (void)x; }
#  define Q_UNUSED(x) qUnused(x);
#else
#  define Q_UNUSED(x) (void)x;
#endif

这可能更难理解。此外,它可能会增加完全删除参数名的诱惑,这可能会使函数更难理解。当更改代码以使用以前未使用的参数时,这种样式当然也比其他样式涉及更多的编辑操作。

你比我快了10秒…:)我经常遇到相反的情况。哎呀,
事件
警告是在不同的函数中生成的。我得到了
选项
小部件
的警告。模板内联void unused(Ts…{}void f(int*p,bool b,const int&k){unused(p,b,k);}
#if defined(Q_CC_RVCT)
template <typename T>
inline void qUnused(T &x) { (void)x; }
#  define Q_UNUSED(x) qUnused(x);
#else
#  define Q_UNUSED(x) (void)x;
#endif
void paint(QPainter *painter, const QStyleOptionGraphicsItem * /* option */,
           QWidget * /* widget */)
{
    // ...
}