我有一个跨平台的应用程序,在我的几个函数中,并不是所有传递给函数的值都被利用。因此我从GCC得到一个警告,告诉我有未使用的变量。

绕开警告的最佳编码方式是什么?

在函数周围使用#ifdef ?

#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{

这是如此丑陋,但似乎是编译器更喜欢的方式。

还是把函数末尾的变量赋值为0 ?(我讨厌这样做,因为它改变了程序流中的某些东西,从而使编译器警告静音)。

有正确的方法吗?


当前回答

我看到的是这样,而不是用(无效的)极端的方式来掩盖警告:

void foo(int param1, int param2)
{
    std::ignore = param2;
    bar(param1);
}

看起来这是c++ 11中添加的

其他回答

当前的解决方案是最好的——如果不使用参数名,就注释掉它。这适用于所有编译器,因此不需要使用预处理程序专门为GCC做这件事。

我看不出你对警告有什么意见。在方法/函数头文件中记录编译器xy将在这里发出(正确的)警告,但是平台z需要这些变量。

警告是正确的,不需要关闭。它不会使程序失效——但它应该被记录下来,这是有原因的。

一个同事刚给我指了这个小宏

为了方便起见,我将包括下面的宏。

#ifdef UNUSED
#elif defined(__GNUC__) 
# define UNUSED(x) UNUSED_ ## x __attribute__((unused)) 
#elif defined(__LCLINT__) 
# define UNUSED(x) /*@unused@*/ x 
#else 
# define UNUSED(x) x 
#endif

void dcc_mon_siginfo_handler(int UNUSED(whatsig))

一种更简洁的方法是只注释掉变量名:

int main(int /* argc */, char const** /* argv */) {
  return 0;
}

哈哈!我不认为还有其他问题能比这个问题更好地揭示所有被混沌腐化的异教徒!

在c++ 17中有一个明确的指导原则。早在2009年,这个选项就像今天一样可用。如果有人说它在Doxygen中被认为是一个bug,那么Doxygen中就有一个bug