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

有正确的方法吗?


当前回答

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

#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))

它不那么难看。

其他回答

我发现大多数给出的答案只适用于局部未使用的变量,并且会导致未使用的静态全局变量的编译错误。

另一个宏需要抑制未使用的静态全局变量的警告。

template <typename T>
const T* UNUSED_VARIABLE(const T& dummy) { 
    return &dummy;
}
#define UNUSED_GLOBAL_VARIABLE(x) namespace {\
    const auto dummy = UNUSED_VARIABLE(x);\
}

static int a = 0;
UNUSED_GLOBAL_VARIABLE(a);

int main ()
{
    int b = 3;
    UNUSED_VARIABLE(b);
    return 0;
}

这是因为匿名命名空间中的非静态全局变量不会报告任何警告。

c++ 11是必需的

 g++  -Wall -O3  -std=c++11 test.cpp

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

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

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

大多数时候,使用预处理器指令被认为是邪恶的。理想情况下,你应该像避开害虫一样避开它们。记住,让编译器理解你的代码很容易,让其他程序员理解你的代码就难多了。到处都有几十个这样的案例,这让你以后很难阅读,也让别人现在很难阅读。

一种方法可能是将参数放在某种类型的参数类中。然后,您可以只使用变量的一个子集(实际上相当于为0赋值),或者为每个平台对该参数类有不同的专门化。然而,这可能并不值得,你需要分析它是否合适。

如果你能阅读不可能的模板,你可能会在“例外c++”一书中找到高级技巧。如果阅读您代码的人能够掌握书中所教的疯狂内容,那么您将拥有易于阅读的漂亮代码。编译器也会很清楚你在做什么(而不是通过预处理隐藏所有内容)

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

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

未引用参数(p)定义为

#define UNREFERENCED_PARAMETER(P)          (P)

在WinNT.h。