代码之家  ›  专栏  ›  技术社区  ›  Roddy

如何“隐藏”已声明但从未使用过的“虚假”警告?

  •  7
  • Roddy  · 技术社区  · 14 年前

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

    我正试图让我的代码100%的警告免费,所以希望有一种方法来掩盖这些特别的警告(注意-但不是简单地关闭警告!)

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

    例如,将此函数添加到my.cpp模块可以修复这四个项的警告,但看起来有点“特别”。有没有更好的,最好是自我记录的方式来做这件事?

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

    编辑:亚历克斯建议如下:

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

    …很遗憾,这不起作用,因为编译器无法巧妙地管理警告状态,因此仍会显示消息。

    编辑2:阿什利斯布兰有一个很好的建议。我通过构建“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
    

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

    3 回复  |  直到 14 年前
        1
  •  9
  •   AshleysBrain    14 年前

    引用变量的常见方法如下:

    #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来试用它,但这对其他编译器是有效的。

        2
  •  6
  •   Alex Budovski    14 年前

    C++ Builder是否支持 #pragma warning 选择权?如果是,你可以在 #include 线。

    伪码

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

    像这样的…

    This might help 对于C++Builder。

        3
  •  2
  •   Dmitry    14 年前

    另一种选择是使用类似于:

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

    boost和qt ignore_unused_variable_warning Q_UNUSED 分别是。

    下面是一篇关于它的小文章@sutter's mill: Shutting up compiler warnings