【问题标题】:How to suppress warnings in external headers in Visual C++如何在 Visual C++ 中抑制外部标头中的警告
【发布时间】:2011-02-02 06:35:26
【问题描述】:

我正在开始一个新的 BREW 项目,并且我想使用警告级别 4 (/W4) 进行编译,以保持应用程序代码的整洁。问题是 BREW 头文件本身不能用 /W4 干净地编译。

在 gcc 中,您可以使用 -I 和 -isystem 来区分应用程序头和系统头,然后默认情况下 gcc 不会在系统头中报告任何编译警告。 Visual C++中是否有等效机制?

【问题讨论】:

标签: visual-c++ suppress-warnings brew-framework brewmp


【解决方案1】:

仅在无法更改但需要包含的标题块周围使用此方法。

您可以选择性地暂时禁用所有警告,如下所示:

#pragma warning(push, 0)        
//Some includes with unfixable warnings
#pragma warning(pop)

您可以选择传入警告编号来禁用,而不是 0,例如:

#pragma warning( push )
#pragma warning( disable : 4081)
#pragma warning( disable : 4706 )
// Some code
#pragma warning( pop ) 

【讨论】:

  • StackOverflow 摇滚。感谢您的完整答案。这个解决方案比较烦人,因为它必须在每个源文件中正确完成,而在 gcc 中您只需正确配置一次 makefile。
  • @Bob:没问题,很高兴为您提供帮助。您可以尝试将这些包含放在不同的文件中,然后将包含警告禁用仅围绕该文件。
  • 作为附加说明,可以在一行中禁用多个警告,如下所示:#pragma warning( disable : 4081 4706 )
  • warning(push, 0) 似乎不能在 cpp 内部工作,只能在标头内部工作。
  • 如果你想在#define 中使用#pragma,你可以这样做:#define DISABLE_BAD_WARN __pragma(warning( disable : 4244 4626 5027 5031 4514))
【解决方案2】:

Visual C++ 团队刚刚添加了对外部标头中警告级别的支持。您可以在他们的博文中找到详细信息:Broken Warnings Theory

本质上,它会自动执行此处建议手动执行的操作:在 #include 指令之前推送新的警告级别并在之后立即弹出它。还有其他标志来指定外部头文件的位置,将所有 包含视为外部的标志,#pragma system_header 和 Clang 或 GCC 中不可用的功能(在撰写本文时)可以在跨模板实例化堆栈时查看外部头文件中的警告该模板已在用户代码中实例化。

除了该帖子下的cmets,您还可以在a reddit announcement for that post找到一些有用的讨论。

【讨论】:

  • 签入:截至 2019 年 10 月,此选项仍有缺陷,但仍然非常有用。这是一个很好的基础,但仍然没有达到-isystem 或类似的水平;目前,警告禁用编译指示中包含的包装仍然可以明显更好地处理某些事情。
  • @JustinTime2ReinstateMonica 你能详细说明什么是行不通的吗?
  • 不幸的是,@AlexeyAndronov,我不记得几个月前似乎不起作用的东西是什么;如果我记得,但还没有修复,我会在这里记下。
  • 文章中提到的 /external 标志似乎是预览版。我在 VS2019 编译器标志文档中找不到任何提及它...有谁知道这个标志发生了什么?
  • @AlexeyAndronov /external:anglebrackets 不适用于 /analyze,事实上没有一个默认的 include 或 excludepath 库被排除在外。简直太糟糕了!
【解决方案3】:

我不相信 Visual C++ 让您与众不同。您可以在 include 周围使用 #pragma warning 来伪造它:

#pragma warning(push, 0)
#include "mywarningheader.h"
#pragma warning(pop)

【讨论】:

  • @einpoklum 区分您的应用程序特定的标头和您无法更改的其他(第三方、系统等)标头。
【解决方案4】:

这个问题好像有答案了。

this post 谈到 /external:I 可用于包含带有一组特殊警告的标头。

我自己没有测试过,但是博文是2017年的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 2021-09-04
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多