【问题标题】:How to 'hide' spurious "declared but never used" warnings?如何“隐藏”虚假的“已声明但从未使用”警告?
【发布时间】:2011-02-12 07:58:51
【问题描述】:

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

我正在尝试让我的代码 100% 无警告,所以想要一种屏蔽这些特定警告的方法(注意 - 但不是简单地关闭警告!)

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

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

static int fakeUse()
{
  return OneHour + OneMinute + OneSecond + OneMillisecond;
}

编辑:亚历克斯提出了这样的建议:

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

【问题讨论】:

  • 如果你写了一个从未被调用过的静态函数,你不会也收到警告吗?
  • @ptomato。似乎不是:-) - 我在心里争论这是一个错误还是一个功能。
  • 有没有机会改用 VC++ 或请 Borland 的人来解决这个问题?因为它来自他们的头文件/编译器,而不是你的代码 IIUC。
  • @Alex - 我认为它可能已在最新版本中修复。不,VC++ 不是一个选项。

标签: c++ warnings c++builder


【解决方案1】:

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

在伪代码中

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

类似的...

This might help 用于 C++ Builder。

【讨论】:

  • +1 是一个不错的尝试 :-) 遗憾的是,警告禁用仅在输出消息时(即编译结束)有效 - 所以如果你“弹出”,消息仍然显示。如果您不弹出,则“未使用”变量的所有警告都将被隐藏。
【解决方案2】:

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

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

// ...

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

“强制转换为 void”实际上意味着“对这个表达式不做任何事情”,因此应该等同于无操作。它也算作对变量的引用,因此警告被静音。不过,您需要将它放在函数代码中,因此类构造函数或启动方法可能会为您做。我没有 C++ Builder 可以试用,但这适用于其他编译器。

【讨论】:

  • 但是问题不是出自系统头文件,而不是他的代码吗?
  • @Alex,是的,但我仍然可以通过这种方式修复它。编译器只能在编译完所有代码后推断出没有使用静态。
【解决方案3】:

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

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

Boost 和 Qt 分别有 ignore_unused_variable_warningQ_UNUSED

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

【讨论】:

  • 不错的链接,谢谢。我有一种感觉,如果禁用优化,这种模板方法可能会“膨胀”,否则它运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多