您可以关闭特定位置包含的任何标头的(特定)编译器警告吗?

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获取特定的标头值

将元素编译到没有任何#localvariable 的特定位置

你是否遵循任何特定模式的连接? [关闭]

您如何确定网站建立在啥技术之上? [关闭]

限制网站链接到特定的地理位置

返回包含特定位置数字的字符串