【问题标题】:Is there a way to disable all warnings with a pragma?有没有办法用编译指示禁用所有警告?
【发布时间】:2010-10-06 06:09:21
【问题描述】:

我已经开始了一个新项目,并决定确保它在启用 /Wall 选项的情况下干净地构建。唯一的问题是并非所有 3rd 方库(如 boost)在没有警告的情况下编译,所以我在共享标头中这样做:

#pragma warning(push)

#pragma warning(disable:4820)
#pragma warning(disable:4619)
#pragma warning(disable:4668)
#pragma warning(disable:4625)
#pragma warning(disable:4626)
#pragma warning(disable:4571)
#pragma warning(disable:4347)
#pragma warning(disable:4640)
#pragma warning(disable:4365)
#pragma warning(disable:4710)
#pragma warning(disable:4820)
#pragma warning(disable:4350)
#pragma warning(disable:4686)
#pragma warning(disable:4711)
#pragma warning(disable:4548)

#include <boost/array.hpp>
#include <boost/assert.hpp>
#include <boost/assign.hpp>
#include <boost/bind.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp>
#include <boost/format.hpp>
#include <boost/function.hpp>
#include <boost/integer.hpp>
#include <boost/optional.hpp>
#include <boost/regex.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/utility.hpp>
#include <boost/variant.hpp>

#pragma warning(pop)

这很好用,但每次我添加新的 boost 标头时,我都必须将它们生成的任何警告添加到列表中。有没有办法说禁用这段代码的所有警告?

【问题讨论】:

    标签: c++ visual-c++ pragma


    【解决方案1】:

    您可以推送/弹出低级别的警告,如下所示:

    #pragma warning(push, 0)        
    
    #include <boost/bind.hpp>
    #include <boost/shared_ptr.hpp>
    // ...
    
    #pragma warning(pop)
    

    但要知道,不可能禁用所有警告。例如,某些链接器警告是无法关闭的。

    【讨论】:

    • 我并不是要纵容死灵术,但在您的评论中,我看到了与推送/弹出警告的一对一关系。如果我禁用 N 个警告,我需要调用 pop N 次吗?再次,很抱歉复活一个旧线程。
    • 您禁用的警告数量无关紧要。 “推”的数量必须与“弹出”的数量相匹配。
    • 另外,有趣的是,如果使用#pragma warning (pop),仍然会发出一些警告(4514 是一个例子),可能是因为在某些编译后上下文中检测到这些警告条件。
    【解决方案2】:

    我之前所做的是设置“W3”选项而不是“Wall”,然后在我放置的每个源 .cpp 文件中

    #pragma warning(push, 4)
    

    在所有“#include...”行之后的顶部,然后

    #pragma warning(pop)
    

    作为文件的最后一行。

    这样您的代码中会出现 4 级警告,而第三方代码中会出现 3 级警告,而您对此无能为力。

    【讨论】:

    • #pragma warning 指令包装你自己的每一个代码文件似乎比只包装有问题的第3 方#includes 需要更多的工作。但如果它适合你...
    【解决方案3】:
    #pragma warning(disable:4820)
    #pragma warning(disable:4619)
    #pragma warning(disable:4668)
    

    为了更少的行......

    #pragma warning (disable : 4820 4619 4668)
    

    【讨论】:

      【解决方案4】:

      使用Assaf Lavie's answer 中描述的技术,可以创建辅助宏:

      #define DISABLE_ALL_WARNINGS_BEGIN \
          __pragma(warning(push, 0))
      
      #define DISABLE_ALL_WARNINGS_END \
          __pragma(warning(pop))
      

      它们可以通过以下方式使用(online demo):

      DISABLE_ALL_WARNINGS_BEGIN
      void foo(int a)
      {
          // this function should generate the following warning
          // "warning C4100: 'a': unreferenced formal parameter"
          // unless it is wrapped inside "DISABLE_ALL_WARNINGS" section
      }
      DISABLE_ALL_WARNINGS_END
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-29
        相关资源
        最近更新 更多