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)
代替.不幸的是,这不是一个特别精细的控制.我不知道更有针对性的机制.
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)
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)
我想最简单的解决方案是编写一个简单的脚本,该脚本将根据文件名和警告类型调用编译器、编译并删除不需要的输出。您可以为每个编译器使用不同的脚本。
只需更新您的 makefile 以使用此脚本,而不是直接调用编译器。