假设我有一个如下所示的函数:
#define LOWER_BOUND 0
#define UPPER_BOUND 42
int is_value_in_range( some_typedef val)
{
return ((LOWER_BOUND <= val) && (val <= UPPER_BOUND));
}
假设我正确配置了警告,如果some_typedef
结果是一个无符号类型我会收到一条警告,指出无符号类型与 0 进行毫无意义的比较。当然这是真的,而且是有道理的。
然而,可以说我do由于一个或多个可能的原因,希望在代码中对零进行检查,例如:
- 虽然界限始终是编译时常量,但它们可能会发生变化(并且宏可能不会“实时”靠近函数)。例如,可以通过将选项传递给编译器来设置边界。
- 我可能想防止稍后将 typedef 更改为有符号类型,因为在更改时,可能不会仔细检查 typedef 的每次使用。
有没有一种体面的、合理便携的方法来消除这里的警告而不完全关闭它?
如果合理的话,依赖于“STATIC_ASSERT()”之类的功能(我可以使用)的东西是可以接受的。如果类型发生变化以迫使某人查看代码,我可以中断编译。但值得注意的是typeof
不是我在所有目标编译器中都可用的东西。
我专门寻找 C 语言解决方案,所以模板在这里没有任何用处......
如果some_typedef
不知道是未签名还是已签名,我认为你运气不好。
如果你事先知道some_typedef
未签名,你可以使用
#if LOWER_BOUND > 0
return ((LOWER_BOUND <= val) && (val <= UPPER_BOUND));
#else
return ((val <= UPPER_BOUND));
#endif
或者在这种情况下,您可以使用我的首选版本:
return (val-LOWER_BOUND <= UPPER_BOUND-LOWER_BOUND);
Edit:我假设如果some_typedef
不知道是否具有特定的符号,那么UPPER_BOUND
and LOWER_BOUND
两者都必须是积极的。否则你会得到非常古怪的结果some_typedef
晋升为未签名。因此,您始终可以安全地使用:
return ((uintmax_t)val-LOWER_BOUND <= UPPER_BOUND-LOWER_BOUND);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)