我正在使用一些自动生成的代码,这些代码往往有像
这样的行void f(int16_t a)
{
if (a < INT32_MAX)
...
}
这显然会产生警告,例如:
warning: comparison is always true due to limited range of data type
我无法更改GCC命令行选项,我可以在自动生成的东西之前/之后添加代码,如下所示:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wtype-limits"
#pragma GCC diagnostic ignored "-Wtautological-constant-out-of-range-compare"
#include "autogenerated.h"
#pragma GCC diagnostic pop
哪个版本适用于较新的GCC版本,但我需要支持回gcc-3.4.6。我可以处理丢失的#pragma GCC diagnostic push
,但在以前的版本中,此警告似乎与-Wextra
捆绑在一起。所以,我尝试禁用它:
// GCC 4.6+ needed for push/pop
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
#pragma GCC diagnostic push
#endif
// Disable warnings about unknown pragmas in case some of the options
// aren't present in the current version
#pragma GCC diagnostic ignored "-Wpragmas"
// Disable the problematic warnings
#pragma GCC diagnostic ignored "-Wtautological-constant-out-of-range-compare"
#pragma GCC diagnostic ignored "-Wsign-compare"
#pragma GCC diagnostic ignored "-Wtype-limits"
// Sometimes it is bundled in -Wextra without a specific one, so disable that too
#pragma GCC diagnostic ignored "-Wextra"
// Disable everything else as well!
#pragma GCC diagnostic ignored "-Wall"
#include "autogenerated.h"
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
#pragma GCC diagnostic pop
#else
#pragma GCC diagnostic warning "-Wtautological-constant-out-of-range-compare"
#pragma GCC diagnostic warning "-Wsign-compare"
#pragma GCC diagnostic warning "-Wtype-limits"
#pragma GCC diagnostic warning "-Wextra"
#pragma GCC diagnostic warning "-Wall"
#pragma GCC diagnostic warning "-Wpragmas"
#endif
我仍然得到警告。
修改
经过一番观察后,似乎这是不可能的。#pragma GCC diagnostic
中添加了gcc-4.2.4
,完全忽略了这些行。没有警告,因为-Wpragmas
中也没有gcc-3.4.6
。
我不得不求助于更改/欺骗生成器而不创建可警告的代码。
答案 0 :(得分:2)
尝试使用#pragma GCC system_header
。
来自手册:
声明操作系统和运行时库接口的头文件通常不能严格符合C语言编写。因此,GCC会在系统头文件中给出代码特殊处理。除了'#warning'(参见诊断)生成的警告之外的所有警告都会被抑制,而GCC正在处理系统标题。