当我使用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