我希望对特定包含文件直接或间接包含的所有文件禁用特定警告。例如,我想禁用警告“你正在为字符串文字指定一个字符串文字*”,对于#include <bar/*>
所包含的文件所包含的所有文件或文件(我的情况下的明星意味着“任何东西可能在这里“)。
原因是,我必须编程的一些人不能使用“const”,所以最后我得到很多关于特定字符串文字滥用的警告。我想忽略来自他们代码的成千上万的警告,所以我可以专注于我自己的代码中的错误并修复它们。
我使用的是英特尔C ++和GCC。我的一些伙伴使用clang,所以我很乐意听到这方面的解决方案。
答案 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)