我有一个跨平台的应用程序,在我的几个函数中,并不是所有传递给函数的值都被利用。因此我从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 func(void *aux UNUSED)
{
    return;
}

SMTH是这样的,在这种情况下,如果你不使用aux,它就不会警告你

其他回答

在c++ 11中,这是我使用的解决方案:

template<typename... Ts> inline void Unreferenced(Ts&&...) {}

int Foo(int bar) 
{
    Unreferenced(bar);
    return 0;
}

int Foo2(int bar1, int bar2) 
{
    Unreferenced(bar1, bar2);
    return 0;
}

被验证为可移植(至少在现代msvc, clang和gcc上),并且在启用优化时不会产生额外的代码。 在没有优化的情况下,将执行额外的函数调用,并将对参数的引用复制到堆栈中,但不涉及宏。

如果额外的代码是一个问题,你可以使用这个声明:

(decltype(Unreferenced(bar1, bar2)))0;

但在这一点上,宏提供了更好的可读性:

#define UNREFERENCED(...) { (decltype(Unreferenced(__VA_ARGS__)))0; }

你可以把它放在"(void)var;"表达式中(什么都不做),这样编译器就可以看到它被使用了。这在编译器之间是可移植的。

E.g.

void foo(int param1, int param2)
{
    (void)param2;
    bar(param1);
}

Or,

#define UNUSED(expr) do { (void)(expr); } while (0)
...

void foo(int param1, int param2)
{
    UNUSED(param2);
    bar(param1);
}

使用UNREFERENCED_PARAMETER(p)可以工作。我知道它是在Windows系统的WinNT.h中定义的,也可以很容易地为gcc定义(如果它还没有)。

未引用参数(p)定义为

#define UNREFERENCED_PARAMETER(P)          (P)

在WinNT.h。

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

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

总是注释掉参数名是否不安全?如果不是,你可以做一些

#ifdef _MSC_VER
# define P_(n) n
#else
# define P_(n)
#endif

void ProcessOps::sendToExternalApp(
    QString sAppName, QString sImagePath,
    qreal P_(qrLeft), qreal P_(qrTop), qreal P_(qrWidth), qreal P_(qrHeight))

它不那么难看。