【问题标题】:Can you turn off (specific) compiler warnings for any header included from a specific location?您可以关闭特定位置包含的任何标头的(特定)编译器警告吗?
【发布时间】:2010-07-17 17:50:06
【问题描述】:

我有一个生成大量警告的第三方库,即使在 /W3 下也是如此。我有没有办法告诉编译器“禁用此目录或其子目录中包含的任何文件的 C4244”?当然,我不想在我们自己的代码库中禁用警告,也不想跟踪所有可能的包含并用#pragma warning(... 包装它

【问题讨论】:

  • 好问题 :) 如果我可以关闭来自 Qt 标头的警告,我会很高兴。
  • @Vitor:我确定我不知道你在说什么。 ;)
  • 我不确定编译器是否可以做到。但实际上,您可以在编译后过滤这些警告。
  • @Praetorian 有一个适合您的答案。或者,如果您愿意,也可以使用 #pragma warning(push) #pragma warning(disable:4244) #include "3rdParty.h"` #pragma warning(pop)

标签: c++ visual-studio visual-studio-2008


【解决方案1】:

我不想在这里回答我自己的问题,但我担心这种情况下的“正确”答案是:不可能。

【讨论】:

  • 是的。我什至试图滥用预处理器来生成一个禁用警告的 INCLUDE 宏,但这似乎也不可能。我认为获得一些合理输出的唯一方法是 grep 编译器警告输出,但现在我只是忍受所有警告。
  • 在 Visual Studio 2015 中(至少)有一个项目 Properties / All Options / Disable specific warnings 您可以设置。用于此的 CLI 是 /wd4244。在其他编译器中,它可能是 /nowarn:4244
【解决方案2】:

您可以在VS Project Settings > Command-line Options 中添加标志,例如/wd4600,以告诉编译器禁止特定的Complier Warnings

【讨论】:

  • 这错过了他所说的部分,“我不想在我们自己的代码库中禁用警告。”
【解决方案3】:

我不确定您的意思是不想用#pragma 指令包装您的包含语句,还是不想花时间跟踪正确的指令。如果是后者,那么这就是我过去所做的:

#ifdef _MSC_VER
#pragma warning( disable : 4244 )
#endif

#include "MyHeader.h"

#ifdef _MSC_VER
#pragma warning( default : 4244 ) /* Reset to default state */
#endif

【讨论】:

  • 对不起,是前者。我已经知道如何通过#pragma 禁用警告。
  • 这应该可以。编译器会记住在编译声明时生效的警告编译指示。
  • @Hans:这可能会关闭 MyHeader.h 生成的警告,但它不能回答我的问题。我不想在几百个文件中搜索几十个库包含,然后用#pragmas 包装它们。
  • @mos:你为什么要搜索?编译器会提醒您错过了一个。
  • @mos:您不必手动搜索每个文件来执行此操作;只需对整个项目/解决方案进行搜索和替换以插入 #pragma 包装器。您甚至可以使用一些脚本语言而不是 Visual Studio 的搜索和替换来提供此库使用的头文件列表,以使任务更容易。而且,正如 Hans 所指出的,编译器会提醒您遗漏的任何内容。
【解决方案4】:

您可以尝试从包含路径中删除第 3 方项目。然后创建一个与第 3 方项目具有相同 dir 结构和头文件的子目录,以便所有 #include 现在找到您的头文件。然后在每个假标头 xxxx.h 中设置编译指示,然后包含真正的 xxxx.h 标头,然后清除编译指示。为了避免递归地包含同一个文件,您必须在#include 中添加一个额外的目录。

就个人而言,我只是浏览您的项目并添加编译指示。

【讨论】:

    【解决方案5】:

    试试:

    //in wrapper_3rdParty.h
    #pragma once
    
    #pragma warning(push)
    #pragma warning(disable : 4244)
    
    #include "3rdParty.h"
    
    #pragma warning(pop)
    

    然后在您的代码中,只需 #include "wrapper_3rdParty.h"

    这会处理警告中default 行为的问题,并且您使用 htat 包的所有实例都会抑制警告。

    【讨论】:

    • 为了在一个地方响应您的所有 cmets:库很大,我不得不编写几十个这样的包含。我问的是捷径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 2013-01-27
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多