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

Joh*_*itb 68 c++ suppress-warnings

我想对特定包含文件直接或间接包含的所有文件禁用特定警告.例如,我想禁用警告"你正在为字符串文字指定一个字符串文字*",包括a所包含的文件所包含的所有文件或文件#include <bar/*>(在我的情况下,明星意味着"任何东西可能在这里").

原因是,我必须编程的一些人不能使用"const",所以最后我得到很多关于特定字符串文字滥用的警告.我想忽略来自他们代码的成千上万的警告,所以我可以专注于我自己的代码中的错误并修复它们.

我使用的是英特尔C++和GCC.我的一些伙伴使用clang,所以我很乐意听到解决方案.

Kon*_*lph 67

使用GCC时,您可以使用-isystem标志而不是-I标志来禁用该位置的警告.

所以如果你现在正在使用

gcc -Iparent/path/of/bar …
Run Code Online (Sandbox Code Playgroud)

使用

gcc -isystem parent/path/of/bar …
Run Code Online (Sandbox Code Playgroud)

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

  • 在clang中有--system-header-prefix =选项,请参阅http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-in-system-headers (3认同)

Bra*_*rad 38

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

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-W<evil-option>"
#include <evil_file>
#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)

例如:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include <QtXmlPatterns>
#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*lia 31

当我使用时g++,我有第三方标题,通过默认的-Wall -Wextra&co 产生大量警告.我倾向于将它们分成单独的包含,指定.system_header #pragma

[...] GCC提供了系统头部特殊处理中的代码.#warningGCC正在处理系统标题时,除了(参见诊断)生成的警告之外的所有警告都将被禁止.系统标题中定义的宏在任何扩展的位置都不受几个警告的影响.当我们发现警告由于系统头中定义的宏中的代码而产生大量误报时,会临时授予此免疫权.

[...]

还有一个指令,#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
Run Code Online (Sandbox Code Playgroud)

  • 哦,非常好。+1 ...不幸的是,这些文件往往在*其他包含文件之前*,并且应用编译指示似乎会影响文件的其余部分,即*所有*以下包含文件。 (2认同)
  • @Green 是的,这就是我的意思。尽管如此,这要求我要么将所有有问题的包含放在包含列表的末尾(正如我所说,这通常是不可取的甚至不可能的)*或*将所有有问题的包含放入一个单独的标题中,然后您将其包含在内。在大型协作项目中,这也不是一个完美的选择。 (2认同)
  • @Konrad:第二个解决方案是我采用的。 (2认同)

Gil*_*aor 0

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

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