我有一个跨平台的应用程序,在我的几个函数中,并不是所有传递给函数的值都被利用。因此我从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++ 17中有一个明确的指导原则。早在2009年,这个选项就像今天一样可用。如果有人说它在Doxygen中被认为是一个bug,那么Doxygen中就有一个bug

其他回答

在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; }

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

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

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

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

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

首先,警告是由源文件中的变量定义生成的,而不是头文件。头文件可以保持原始状态,而且应该保持原始状态,因为您可能正在使用类似doxygen的东西来生成api文档。

我假设您在源文件中有完全不同的实现。在这些情况下,您可以注释掉有问题的参数,或者直接写入参数。

例子:

func(int a, int b)
{
    b;
    foo(a);
}

这可能看起来很神秘,所以定义了一个像UNUSED这样的宏。MFC的做法是:

#ifdef _DEBUG
#define UNUSED(x)
#else
#define UNUSED(x) x
#endif

像这样,在调试版本中仍然会看到警告,可能会有帮助。

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

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

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