无法抑制旧GCC上的警告

时间:2015-05-20 13:04:27

标签: c gcc compiler-warnings

我正在使用一些自动生成的代码,这些代码往往有像

这样的行
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

我不得不求助于更改/欺骗生成器而不创建可警告的代码。

1 个答案:

答案 0 :(得分:2)

尝试使用#pragma GCC system_header

来自手册:

  

声明操作系统和运行时库接口的头文件通常不能严格符合C语言编写。因此,GCC会在系统头文件中给出代码特殊处理。除了'#warning'(参见诊断)生成的警告之外的所有警告都会被抑制,而GCC正在处理系统标题。

相关问题