如果已实施,请使用pragma禁用警告

时间:2017-03-23 15:09:54

标签: c++ clang compiler-warnings

Clang最近实施了一个恼人的警告。如果我使用#pragma clang diagnostic ignored禁用它,那么较旧的Clang版本将发出“未知警告组”警告。

有没有办法测试警告是否已实施?

1 个答案:

答案 0 :(得分:2)

Clang的最新版本实现了__has_warning功能检查宏。由于Clang只使用一个警告标志池来模拟GCC(反之亦然),因此使用特征检查内省对GCC进行编码是合理的:

#if __GNUC__ && defined( __has_warning )
#   if __has_warning( "-Wwhatever" )
#       define SUPPRESSING
#       pragma GCC diagnostic push
#       pragma GCC diagnostic ignored "-Wwhatever"
#   endif
#endif

// Code that trips warning

#ifdef SUPPRESSING
#   undef SUPPRESSING
#   pragma GCC diagnostic pop
#endif

这有点繁琐的copypasta。使用包含文件可以避免这样做:

#define SUPPRESS_WARNING "-Wwhatever"
#include "suppress_warning.h"

// Code that trips warning

#include "unsuppress_warning.h"

suppress_warning.h有点棘手,因为__has_warning#pragma不接受宏作为参数。因此,请从Github或此Wandbox demo获取。