Visual studio -微软Visual Studio C++;编译程序

Visual studio -微软Visual Studio C++;编译程序,visual-studio,gcc,clang,warnings,static-analysis,Visual Studio,Gcc,Clang,Warnings,Static Analysis,我通常喜欢在编程时启用很多警告。但是,有些库包含容易引起警告的代码(..、python、Qt等)。当使用gcc编译时,我可以使用-isystem而不是-I来使其静音。如何使用MS编译器执行相同的操作?我知道警告#pragma,但我希望解决方案不涉及编译器特定的代码。我也知道我可以关闭特定的警告,但这也不是我想要的 顺便说一句:isystem应该是这个问题的标签,但我不允许这么做 小结:我希望看到我的代码中的所有警告,而不是外部代码中的警告。否,MSVC没有与之相当的-isystem 查看cl/

我通常喜欢在编程时启用很多警告。但是,有些库包含容易引起警告的代码(..、python、Qt等)。当使用gcc编译时,我可以使用-isystem而不是-I来使其静音。如何使用MS编译器执行相同的操作?我知道警告#pragma,但我希望解决方案不涉及编译器特定的代码。我也知道我可以关闭特定的警告,但这也不是我想要的

顺便说一句:isystem应该是这个问题的标签,但我不允许这么做


小结:我希望看到我的代码中的所有警告,而不是外部代码中的警告。

否,MSVC没有与之相当的
-isystem


查看cl/?的输出:

/禁用警告

/我们将警告n视为错误

/工单发出警告n次

/w为n设置1-4级警告

请注意,这将禁用整个项目的警告;我记得在使用Qt时,我宁愿在最后再次使用#pragma warning disable和enable来更改它的主标题,这样我仍然可以看到我自己源代码的所有警告

编辑作者编辑了他的问题,更新了答案:使用编译器标志无法获得带有警告的代码和没有警告的Qt代码:您将如何告诉编译器什么是“您的”代码

请注意,上述标志也可以应用于文件级别,因此这将允许您仅对包含Qt头的文件禁用警告,但这仍然意味着您无法在该文件中查看自己的代码

所以我坚持上面的答案;这不是很漂亮,但我很确定这是唯一的方法:在Qt头的开头和结尾使用#pragma。要么更改Qt头(甚至更难看),要么选择一种侵入性更小的方式,如下所示:

//your source/header file
#include "shutuppqt.h"
#include <QString>
#include "enableallwarnings.h"
示例“enableallwarnings.h”


不知道为什么MS从来没有捡到这个。
从2017年8月17日起,我们只能尝试投票表决,这似乎仍然是不可能的。

我在这里添加了一个功能请求:

2018年更新:

该问题现已修复,并在标准MS VS安装[]中提供。 微软团队的一篇博文介绍了这些新功能[]


MS的解决方案是灵活的。您不仅可以像使用
--isystem
那样使用路径进行区分,还可以通过使用
#include”“
#include
来区分。这篇博文值得一读,以查看所有不同的定制点。

这现在存在于
/experimental:external/external:I system\u include\u path/external:W0
下。有关更多详细信息,请参阅。

第一部分:您好,谢谢您的回答!我只是编辑了这个问题来澄清我的意思。实际上,您可以使用#pragma在包含有问题的标题时将警告级别推/弹出到0,但这不是我想要的。这样,您将获得文件其余部分的警告。一个完美的解决方案,除了我想在不修改任何代码的情况下完成它。(我实际上无法理解这不是一件常见的事情。)我所要做的就是制作可移植代码,并在不同的环境中测试它,而无需为每个编译器添加单独的预处理器逻辑。第2部分:查看-isystem here:通过使用该选项,可以有效地禁用dir中任何文件的所有警告。这就是你告诉编译器你的代码是什么,或者更重要;什么不是你的代码。cl没有这样的选项,或者至少没有文档化的选项。。。“我真的不明白这不是一件普通的事情”——>我不明白像Qt这样的大型项目不负责消除它产生的大量警告。是的,我同意这一点,但Qt只是一个例子。现在crypto++和python也发出警告。而且,有着数不清的库和几十个编译器/编译器版本,警告肯定会发生。。但是,只要不是所有的编译器都支持这样的标志,那么不管是在代码中还是在编译器输出中,您都必须处理警告。问题是没有人使用它,所以它永远不会脱离实验状态。CMake集成将有助于增强它:它不能很好地与/analyze一起工作
#ifdef MSVC
  #pragma warning ( disable : 4222 ) //or whatever warning Qt emits
#else
  //....
#endif
#ifdef MSVC
  #pragma warning ( enable : 4222 ) //or default instead of enable
#else
  //....
#endif