67

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

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

4

4 回答 4

109

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

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

#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 ) 
于 2010-03-29T23:45:47.960 回答
22

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

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

除了该帖子下的评论,您还可以在该帖子的 reddit 公告中找到一些有用的讨论。

于 2017-12-22T01:01:52.700 回答
6

我不相信 Visual C++ 可以让您区分。您可以通过在包含周围使用来伪造它#pragma warning

#pragma warning(push, 0)
#include "mywarningheader.h"
#pragma warning(pop)
于 2010-03-29T23:51:26.760 回答
3

似乎有一个答案。

这篇文章讨论了/external:I可用于包含带有一组特殊警告的标题。

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

于 2021-03-11T18:41:14.710 回答