我正在决定使用MinGW构建的项目的编译器设置。 GCC似乎有很多用于控制警告的选项。
但我不明白为什么提供一个选项来禁用一些关键的警告并且几乎不会造成任何麻烦。
-Wno-sign-compare:禁用当签名值转换为有符号值时,有符号值与无符号值之间的比较可能产生错误结果时发出警告的警告 无符号。
-Wno-type-limits:禁用警告,如果比较始终为true,则警告,或者由于数据类型的范围有限而始终为false,但不会警告常量表达式
-Wno-logical-op:禁用警告,警告表达式中可疑使用逻辑运算符。这包括在可能需要逐位运算符的上下文中使用逻辑运算符
对我而言,这些是非常有效的警告,我想不出可以禁用它们的用例。如果我能得到一些这样的警告不严重的用例,并且修复它们使代码更改很困难,我会很高兴。
答案 0 :(得分: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-limits] 的范围有限,总是如此
在这种特殊情况下,它有助于关闭该警告,因为它会污染所有编译器输出。
(当然有人可能会争论这种比较是否有用。但是,经常使用它。)
干杯, 菲利克斯
答案 1 :(得分:0)
我有一个环境(ARM mbed OS),其中clock_t
是无符号的。但是C标准库说clock()
应该在失败时返回-1,所以我检查了性质:if(clock() < 0)
。这会引发-Wtype-limits,因为clock()
无法返回负整数。
我可能很容易更改我的代码以匹配不符合要求的环境,但由于没有负面的副作用,我宁愿编写正确的可移植代码并在此环境中禁用警告。