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