如何禁用特定包含文件的警告?
我希望对所有包含的文件禁用特定的警告,直接或间接地通过特定的包含文件。 例如,我想禁止“ #include <bar/*>
包含的文件包含的所有文件或文件”(你正在为char *分配一个string文本)在这里“)。
原因是,我必须编写的一些人不能使用“const”,所以最后我得到了关于特定string字面滥用的许多警告。 我想忽略来自他们代码的数千条警告,所以我可以专注于我自己的代码中的错误并修复它们。
我使用英特尔C ++和GCC。 我的一些伙伴使用铿锵声,所以我也很乐意听到这个解决scheme。
使用GCC时,可以使用-isystem
标志而不是-I
标志来禁用该位置的警告。
所以如果你正在使用
gcc -Iparent/path/of/bar …
使用
gcc -isystem parent/path/of/bar …
代替。 不幸的是,这不是一个特别细致的控制。 我不知道更有针对性的机制。
当我使用g++
而且我有第三方头文件,这些头文件用我一般默认的-Wall -Wextra
&co生成大量的警告。 我倾向于将它们分开包含,指定system_header
#pragma
。
GCC提供了在系统头文件中find的代码特殊处理。 当GCC正在处理系统标题时,除了
#warning
生成的警告(请参阅诊断程序)之外的所有警告都被禁止。 在系统头文件中定义的macros在扩展的任何地方都可以避免出现一些警告。 当我们发现由于系统头文件中定义的macros中的代码而导致警告产生大量的误报时,这种免疫力就可以临时授予。[…]
还有一个指令
#pragma GCC system_header
,它告诉GCC将当前包含文件的其余部分作为系统头文件,不pipe它在哪里find。 该文件中#pragma
之前的代码不会受到影响。#pragma GCC system_header
在主源文件中没有效果。
我比较喜欢这个解决scheme,因为它更加细化,我可以直接把它放在源代码中,而不用太多的命令行参数和包含目录。
可怕的根库的例子:
#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
更好的GCC解决scheme:使用#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
我想最简单的解决scheme是编写一个简单的脚本,根据文件名和警告types调用编译器,编译和去除不需要的输出。 您可以为每个编译器使用不同的脚本。
只要更新你的makefile就可以使用这个脚本,而不是直接调用编译器。