【问题标题】:Can't suppress warnings on an older GCC无法抑制旧 GCC 上的警告
【发布时间】:2015-08-01 18:03:38
【问题描述】:

我正在使用一些自动生成的代码,这些代码往往具有类似的行

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 中。

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

【问题讨论】:

  • 阅读 gcc 手册建议 -w 可能会满足您的需求。
  • Hrm.. 你知道如何在#pragma diagnostic 中使用-w 吗?它只处理警告标志(以-W 开头)并且只有ignoredwarningerror 的选项。我无法更改命令行(更改生成器的机会更大,但我真的不想这样做)。
  • 1) 为什么不用使用最近的 gcc?自 3.x 版本以来,它们已经改进了很多 2) 为什么这些警告会给您带来问题?如果您正在编译其他人的代码,我看不出这是一个问题。
  • 1) 不是我的决定。它目前有效,很快改变的可能性很小(这不是一个微不足道的改变)。 2a)因为-Werror,2b)由于它的包含方式,我最终得到了数千个。

标签: c gcc compiler-warnings


【解决方案1】:

尝试使用#pragma GCC system_header

来自手册:

声明操作系统和运行时库接口的头文件通常不能用严格符合的 C 语言编写。因此,GCC 对系统头文件中的代码进行特殊处理。在 GCC 处理系统标头时,除由“#warning”(请参阅​​诊断)生成的警告之外的所有警告都将被抑制。

【讨论】:

  • 感谢您的回答。请编辑您的问题以改进格式。代码示例和引用可以使用编辑工具进行格式化。所以问题变得更容易阅读和理解。
猜你喜欢
  • 2012-10-02
  • 2023-02-01
  • 2016-06-30
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多