我正在检查带有类型特征的数值范围,无符号类型会生成警告。
Comparison of unsigned expression >= 0 is always true
如何禁用特定代码范围内的某些警告?我用的是海湾合作委员会风格#pragma
与 Clang 但这不起作用。
这是我的代码。
template<typename originT, typename destinationT>
void
assertForNumericRange(const originT value)
{
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wtype-limits"
assertWithReason(value >= std::numeric_limits<destinationT>::min());
assertWithReason(value <= std::numeric_limits<destinationT>::max());
#pragma GCC diagnostic pop
}
Note
目前,我将断言分为三组,浮点型、无符号整型、有符号整型。但如果可能的话,我希望将它们整合为一个。
我正在使用 Xcode 5.0 测试版。在命令行中,它报告如下:
苹果LLVM版本
5.0 (clang-500.1.58) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.3.0
Thread model: posix
您使用的是哪个版本的 Clang?从Clang 用户手册 http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas它应该完全按照你的方式工作。但是你的范围断言不会像你希望的那样工作:
第一个断言本身没有多大意义,如果destinationT
是无符号的,所以 min 给出 0。originT
也是无符号的,那么它显然不是负数,这就是编译器警告您的内容。或者originT
有符号时,比较会将一个或两个操作数转换为其他类型,例如可能转换value
为无符号(因此为正)表示。
例如考虑
assertForNumericRange<signed char, unsigned long>( (signed char)-1);
之间的比较(signed char)-1
and unsigned long
将把-1提升到unsigned long
,有效地给出以下 32 位长的断言:
assertWithReason((unsigned long)0xFFFFFFFF >= std::numeric_limits<destinationT>::min());
assertWithReason((unsigned long)0xFFFFFFFF <= std::numeric_limits<destinationT>::max());
两个比较都会给出 true,而 -1 显然是not在范围内unsigned long
的价值观。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)