您可以关闭特定位置包含的任何标头的(特定)编译器警告吗?
Posted
技术标签:
【中文标题】您可以关闭特定位置包含的任何标头的(特定)编译器警告吗?【英文标题】: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)
。
【参考方案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:库很大,我不得不编写几十个这样的包含。我问的是捷径。以上是关于您可以关闭特定位置包含的任何标头的(特定)编译器警告吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何从HttpResponseMessage获取特定的标头值