2012-12-19 31 views
0

我决定使用MinGW构建的项目的编译器设置。看来海湾合作委员会有一套非常庞大的控制警告的选项。用于GCC警告选项的用例-Wno-sign-compare,-Wno-type-limits和-Wno-logical-op

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

-Wno-sign-compare的:禁用,警告时,当符号值转换为无符号 符号和无符号值之间的比较会产生不正确结果而进行警告。

-Wno型限制:禁用,警告如果比较是永远为真或假,由于数据类型的限制范围的警告,但不警告为常量表达式

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

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

回答

1

自从几天前,我会完全同意。然而,至少在-Wno型限制我现在知道用例:

如果选中一个枚举值是有效范围内的真正组成部分,有时构建这样发生:

/* 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-限制]

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

(当然有人会说这个比较是有用的,但公司经常使用的。)

干杯, 菲利克斯

0

我有哪里clock_t是无符号的环境(ARM mbed OS)。但C标准库说,clock()应该在失败时返回-1,所以我有一个检查然后性质:if(clock() < 0)。由于clock()无法返回负整数,因此会抛出-Wtype-limits。

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