84

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

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

我使用英特尔 C++ 和 GCC。我的一些朋友使用clang,所以我也很高兴听到解决方案。

4

5 回答 5

73

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

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

gcc -Iparent/path/of/bar …

利用

gcc -isystem parent/path/of/bar …

反而。不幸的是,这不是一个特别细粒度的控制。我不知道更有针对性的机制。

于 2011-06-12T12:27:49.043 回答
62

更好的 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
于 2015-05-01T20:50:22.540 回答
38

当我使用g++并且我有第三方标头时,这些标头会生成大量警告,而我通常默认为-Wall -Wextra& co。我倾向于将它们分组在单独的包含中,指定.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
于 2011-06-12T12:37:41.667 回答
0

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

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

于 2011-06-12T12:23:08.867 回答
0

从重复的线程中复制我的答案。

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

GCC 和 VC++ 编译器支持此功能,如下所示:

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

以下是详细规格:

于 2021-04-02T07:21:24.437 回答