0

我正在为使用 MinGW 构建的项目决定编译器设置。GCC 似乎有一组非常庞大的选项来控制警告。

但我不明白的是,为什么提供一个选项来禁用一些关键且几乎不会造成任何滋扰的警告。

-Wno-sign-compare:禁用警告,当有符号值和无符号值之间的比较在有符号值转换为无符号时会产生错误结果时发出警告。

-Wno-type-limits:由于数据类型的范围有限,如果比较始终为真或始终为假,则禁用警告,但不警告常量表达式

-Wno-logical-op:禁用警告表达式中逻辑运算符的可疑使用的警告。这包括在可能需要按位运算符的上下文中使用逻辑运算符

对我来说,这些确实是有效的警告,我想不出可以禁用它们的用例。如果我能得到一些这样的警告不严重的用例并且修复它们进行代码更改很困难,我会很高兴。

4

2 回答 2

1

从几天前开始,我就完全同意了。但是,至少对于 -Wno-type-limits 我现在知道一个用例:

如果您检查枚举的值是否真的在有效范围内,有时会出现这样的结构:

  /* Check if the Input Error is within range */
  if ((ErrorId >= (CS_ErrHdl_ErrorId_t)0) && (ErrorId < CS_ErrHdl_ErrId_EndOfList))
  {
    ...
  }

whereCS_ErrHdl_ErrorId_t是枚举类型并且ErrorId属于该枚举类型。

作为标准枚举(没有给出明确的值)总是以 0 开头,总是有警告:

由于数据类型的范围有限,比较总是正确的 [-Wtype-limits]

在这种特殊情况下,它有助于关闭该警告,因为它会污染所有编译器输出。

(当然有人可能会争论这种比较是否有用。但是,它经常被使用。)

干杯,菲利克斯

于 2013-08-14T11:24:51.900 回答
0

我有一个clock_t未签名的环境(ARM mbed OS)。但是 C 标准库说clock()应该在失败时返回 -1,所以我检查了 then 的性质:if(clock() < 0). 这会抛出 -Wtype-limits 因为clock()不能返回负整数。

对我来说更改代码以匹配不合格环境可能很容易,但由于没有负面影响,我宁愿编写正确的可移植代码并在此环境中禁用警告。

于 2016-05-13T17:30:05.440 回答