如何'隐藏'虚假的“宣告但从未使用过”的警告?

时间:2010-04-26 09:39:55

标签: c++ warnings c++builder

我正在使用Borland(AKA“Embarcodegearland”)C ++ Builder 2007编译器,它有一个小错误,系统头文件中的某些static const项可能会导致虚假"xyzzy is declared but never used"警告。

我正试图让我的代码100%免费警告,所以想要一种掩盖这些特殊警告的方法(注意 - 但不要只是关闭警告!)

另外,我无法修改头文件。我需要一种“伪造”物品使用的方式,最好甚至不知道它们的类型。

例如,将此功能添加到我的.cpp模块会修复这四个项目的警告,但它似乎有些“临时”。有没有更好的,最好是自我记录的方式来做到这一点?

static int fakeUse()
{
  return OneHour + OneMinute + OneSecond + OneMillisecond;
}
编辑:Alex建议这样的事情:

#pragma option push
#pragma warn -8080
#include "dateutils.hpp"
#pragma option pop

...遗憾的是,由于编译器没有巧妙地管理警告状态,因此无法正常工作,因此仍会显示消息。

编辑#2:AshleysBrain有一个很好的建议。我通过构建这样的“dateutils_fix.hpp”头文件来实现它:

#ifndef DATEUTILS_FIXH
#define DATEUTILS_FIXH

#include <dateutils.hpp>

static void FIX_DATEUTIL_WARNINGS()
{
    UNREFERENCED(OneHour);
    UNREFERENCED(OneMinute);
    UNREFERENCED(OneSecond);
    UNREFERENCED(OneMillisecond);
}

#endif

...然后在我自己的代码中#include这个头而不是dateutils.hpp。

3 个答案:

答案 0 :(得分:9)

引用变量的常用方法是这样的:

#define UNREFERENCED(x)  ((void)x)

// ...

void MyFunc()
{
    const int x = 5; // never used for whatever reason
    UNREFERENCED(x); // stops compiler warning
}

'cast to void'实际上意味着'对这个表达式什么都不做'所以应该等同于no-op。它也算作变量的引用,因此警告被静音。您需要将它放在函数代码中,因此类构造函数或启动方法可能会为您完成。我没有C ++ Builder来试试它,但这适用于其他编译器。

答案 1 :(得分:6)

C ++ Builder是否支持#pragma warning选项?如果是这样,您可以在#include行周围禁用该警告。

在伪代码中

#pragma warning(push)
#pragma warning(disable: 1234)
#include <someheader.h>
#pragma warning(pop)

像这样......

This might help用于C ++ Builder。

答案 2 :(得分:2)

另一种选择是使用类似的东西:

template <class T>
inline void unused(const T&) {}

Boost和Qt分别为ignore_unused_variable_warningQ_UNUSED

这里有一篇关于它的文章@Sutter's Mill:Shutting up compiler warnings