如何禁用特定包含文件的警告?


78

我希望禁用对特定包含文件直接或间接包含的所有文件的特定警告。例如,对于所有文件或a包含的文件包含的文件,我想禁用警告“您正在为char *分配字符串文字” #include <bar/*>(在我的情况下,星号表示“这里可能有任何东西”)。

原因是,我必须与之进行编程的某些人无法使用“ const”,因此最后,我收到有关该特定字符串文字滥用的许多警告。我想忽略来自其代码的成千上万的警告,因此我可以专注于自己的代码中的错误并加以解决。

我使用Intel C ++和GCC。我的一些伙伴使用clang,所以我也很高兴听到解决方案。



我说对了吗-如果有问题的文件包含在中<bar/the_file.h>,则应该禁止显示警告,而<the_file.h>没有显示警告?
Xeo

@Neil感谢您的相关链接。只是为了使其他人可能会有一些不必要的关联更清楚:上面的两个链接不是伪造的链接!
Johannes Schaub-litb 2011年

@Xeo并不是特别如此。我可以忍受对该文件禁用所有警告。它不必具有特定的包含模式。我怀疑我提出问题的方式有点不幸。
Johannes Schaub-litb 2011年

您正在使用什么编译器?(抑制警告的方法通常因编译器而异。)
Ben Hocking

Answers:


71

使用GCC时,您可以使用-isystem标志代替-I标志来禁用该位置的警告。

因此,如果您当前正在使用

gcc -Iparent/path/of/bar …

使用

gcc -isystem parent/path/of/bar …

代替。不幸的是,这并不是一个特别精细的控件。我不知道有针对性的机制。


4
在铛有--system头前缀=选项,见clang.llvm.org/docs/...
dev_null

47

更好的GCC解决方案:使用#pragma。

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-W<evil-option>"
#include <evil_file>
#pragma GCC diagnostic pop

例如:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include <QtXmlPatterns>
#pragma GCC diagnostic pop

这不是我想要的。我正在寻找一种方法来禁用所有以“ Qt”开头的文件的警告(以您的示例为准。不仅针对单个命名文件。我们已经使用了诊断推送/弹出式程序,但是不幸的是,这无法对文件名进行通配符匹配据我们
所知

对不起,我误会了。在AFAIK中,您只有两种选择:创建一个包含所有相关标头的标头文件,并包装在#pragma诊断中并首先包含它(并依靠多重包含防护措施仅处理一次文件)。或者,使用-isystem将标头视为系统标头。我不认为有一种方法可以基于包含路径(而不是isystem的行为)定义自定义诊断规则。我一直使用“创建“ include_all_bar.h”文件”方法来解决此问题。
布拉德

12
不得不说,尽管这个答案不是最高票,但我确实认为它非常有用。尽管它不能完全满足最初的问题(路径/前缀中的所有库),但它确实提供了一种方法,可以针对给定的标头集有选择地排除某些警告。👍
benschumacher

35

当我使用g++和时,我有第三方标头,它们使用通常的默认值-Wall -Wextra&co生成大量警告。我倾向于将它们分为单独的include,并指定。system_header #pragma

GCC对在系统头文件中找到的代码给予特殊对待。所有警告(由警告生成的警告除外)#warning在GCC处理系统标头时()均被抑制。系统标头中定义的宏在扩展到任何地方都不会受到一些警告。当我们发现警告由于系统头文件中定义的宏中的代码而产生大量误报时,将临时授予这种豁免权。

[...]

还有一个指令,#pragma GCC system_header它告诉GCC将当前头文件的其余部分视为系统头,无论在哪里找到它。#pragma文件中的之前的代码将不受影响。#pragma GCC system_header在主源文件中无效。

我更喜欢这种解决方案 -isystem因为它的粒度更细,我可以将其直接放在源代码中,而不会在命令行参数和包含目录上弄得太多。

丑陋的根库示例:

#ifndef ROOTHEADERS_HPP_INCLUDED
#define ROOTHEADERS_HPP_INCLUDED
#ifdef __GNUC__
// Avoid tons of warnings with root code
#pragma GCC system_header
#endif
#include "TH1F.h"
#include "TApplication.h"
#include "TGraph.h"
#include "TGraph2D.h"
#include "TCanvas.h"
#endif

2
哦,很好。+1…不幸的是,此类文件往往先其他包含文件出现,并且应用编译指示似乎会影响文件的其余部分,即以下所有包含文件。
Konrad Rudolph

@Konrad Rudolph:你确定吗?它不是仅用于一个包含及其子包含吗?
阿米尔·扎德

1
@Green是的,这就是我的意思。尽管如此,这还是要求我要么将所有可疑的包含项放在包含列表的末尾(并且正如我所说的那样通常是不希望的,甚至不可能),要么将所有可疑的包含项放入单独的标头中,然后将其包含在内。在大型协作项目中,这也不是完美的选择。
Konrad Rudolph

2
@Konrad:第二种解决方案是我采用的解决方案。
Matteo Italia

0

我猜最简单的解决方案是编写一个简单的脚本,该脚本将根据文件名和警告类型调用编译器,进行编译并删除不需要的输出。您可以为每个编译器使用不同的脚本。

只需更新您的makefile即可使用此脚本,而不是直接调用编译器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.