【问题标题】:-isystem for MS Visual Studio C++ Compiler-isystem 用于 MS Visual Studio C++ 编译器
【发布时间】:2010-12-17 01:01:09
【问题描述】:

我通常喜欢在编程时启用很多警告。但是,某些库包含容易引起警告的代码(..、python、Qt、..)。使用 gcc 编译时,我可以使用 -isystem 而不是 -I 来使其静音。我怎样才能用 MS 编译器做同样的事情?我知道警告#pragma,但我想要一个不涉及编译器特定代码的解决方案。我也知道我可以关闭特定的警告,但这也不是我想要的。

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

总结:我想从我的代码中查看所有条警告,并从外部代码中查看no条警告。

【问题讨论】:

    标签: visual-studio gcc clang warnings static-analysis


    【解决方案1】:

    截至 2017 年 8 月 17 日,这似乎仍然不可能。

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

    https://developercommunity.visualstudio.com/content/problem/96411/impossible-to-ignore-warnings-from-system-librarie.html

    2018 年更新:

    该问题现已解决并在标准 MS VS 安装中可用 [source]。 MS 团队的一篇博文介绍了新功能 [here]。

    MS 的解决方案非常灵活。您不仅可以像使用--isystem 那样使用路径来区分,还可以通过使用#include "" 还是#include <> 来区分。这篇博文值得一读,以了解所有不同的自定义点。

    【讨论】:

    【解决方案2】:

    这现在存在于/experimental:external /external:I system_include_path /external:W0 下。有关更多详细信息,请参阅https://blogs.msdn.microsoft.com/vcblog/2017/12/13/broken-warnings-theory/

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        不,MSVC 没有 -isystem 等效项。


        查看 cl /? 的输出输出? :

        /wd 禁用警告 n

        /我们将警告 n 视为错误

        /wo 发出一次警告 n 一次

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

        请注意,这会禁用整个项目的警告;我记得在使用 Qt 时,我宁愿更改它的主标头,将 #pragma 警告禁用并在最后再次启用,这样我仍然可以看到我自己的源的所有警告。

        编辑作者编辑了他的问题,更新了答案:没有办法让你的代码有警告和没有警告的Qt代码使用编译器标志:你将如何告诉编译器什么是'你的代码?

        请注意,上述标志也可以在文件级别应用,因此这将允许您仅对包含 Qt 标头的那些文件禁用警告,但 still 意味着您不能在这些文件中查看您自己的代码。

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

        //your source/header file
        #include "shutuppqt.h"
        #include <QString>
        #include "enableallwarnings.h"
        

        示例“shutuppqt.h”

        #ifdef MSVC
          #pragma warning ( disable : 4222 ) //or whatever warning Qt emits
        #else
          //....
        #endif
        

        示例“enableallwarnings.h”

        #ifdef MSVC
          #pragma warning ( enable : 4222 ) //or default instead of enable
        #else
          //....
        #endif
        

        【讨论】:

        • 第 1 部分:您好,感谢您的回答!我刚刚编辑了这个问题以澄清我的意思。实际上,您可以在包含有问题的标头时使用#pragma 将警告级别推送/弹出到 0,但这不是我想要的。这样,您将收到文件其余部分的警告。一个完美的解决方案,除了我想在不更改任何代码的情况下做到这一点。 (我实际上无法理解这不是一件常见的事情。)我想做的只是制作可移植的代码并在不同的环境中对其进行测试,而无需为每个编译器放置单独的预处理器逻辑。
        • 第 2 部分:在此处查看 -isystem:gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/… 通过使用该选项,您可以有效地禁用 dir 中任何文件的所有警告。这就是你告诉编译器你的代码是什么,或者更重要的方式;什么是不是你的代码。
        • cl 没有这样的选项,或者至少没有记录在案的选项......“我实际上无法理解这不是一件常见的事情”-> 我无法理解像 Qt 这样的大项目并没有处理掉它产生的大量警告。
        • 是的,我同意这一点,但 Qt 只是一个例子。现在 crypto++ 和 python 也会发出警告。并且有无数的库和几十个编译器/编译器版本,警告肯定会发生。
        • true.. 但只要不是所有编译器都支持这样的标志,你就必须在代码或编译器输出中处理警告。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多