我有一个跨平台的应用程序,在我的几个函数中,并不是所有传递给函数的值都被利用。因此我从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 ?(我讨厌这样做,因为它改变了程序流中的某些东西,从而使编译器警告静音)。

有正确的方法吗?


当前回答

这工作得很好,但需要c++ 11

template <typename ...Args>
void unused(Args&& ...args)
{
  (void)(sizeof...(args));
}

其他回答

这工作得很好,但需要c++ 11

template <typename ...Args>
void unused(Args&& ...args)
{
  (void)(sizeof...(args));
}

默认情况下,GCC不会标记这些警告。此警告必须通过显式地向编译器传递-Wunused-parameter或隐式地传递-Wall -Wextra(或其他一些标志的组合)来开启。

未使用的参数警告可以通过向编译器传递-Wno-unused-parameter来抑制,但请注意,这个禁用标志必须出现在编译器命令行中任何可能的用于此警告的启用标志之后,这样它才能生效。

使用编译器的标志,例如GCC的标志: -Wno-unused-variable

在GCC和Clang中,你可以使用__attribute__((未使用))预处理器指令来实现你的目标。 例如:

int foo (__attribute__((unused)) int bar) {
   return 0;
}

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

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