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

时间:2011-06-12 12:07:44

标签: c++ suppress-warnings

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

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

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

5 个答案:

答案 0 :(得分:65)

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

所以如果你现在正在使用

gcc -Iparent/path/of/bar …

使用

gcc -isystem parent/path/of/bar …

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

答案 1 :(得分:31)

当我使用g++时,我的第三方标题会产生大量警告,而我的常规默认值为-Wall -Wextra&amp;合。我倾向于将它们分组在单独的包含中,指定system_header #pragma

  

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

     

[...]

     

还有一个指令#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 :(得分:30)

更好的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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

从重复的 thread 复制我的答案。

您可以使用抑制编译指示。

这是 GCC 和 VC++ 编译器支持的,它看起来像这样:

#pragma warning(push)
#pragma warning(disable : 4244)
#pragma warning(disable : 4127)
#pragma warning(disable : 4512)
#include <boost/python.hpp>
#pragma warning(pop)

以下是详细规格: