【问题标题】:Usecases for GCC Warning Options -Wno-sign-compare, -Wno-type-limits and -Wno-logical-opGCC 警告选项的用例 -Wno-sign-compare、-Wno-type-limits 和 -Wno-logical-op
【发布时间】:2012-12-19 14:13:16
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: warnings mingw gcc-warning


    【解决方案1】:

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

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

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

    其中CS_ErrHdl_ErrorId_t 是枚举类型,ErrorId 是该枚举类型。

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

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

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

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

    干杯, 费利克斯

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-26
        • 2017-05-31
        • 2015-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        相关资源
        最近更新 更多