假设我有如下函数:
#define LOWER_BOUND 0
#define UPPER_BOUND 42
int is_value_in_range( some_typedef val)
{
return ((LOWER_BOUND <= val) && (val <= UPPER_BOUND));
}
Run Code Online (Sandbox Code Playgroud)
假设我已经正确配置了警告,如果some_typedef结果是无符号类型,我会得到一个警告,即无符号类型与0进行无意义的比较.当然这是真的,这是有道理的.
但是,假设我确实希望检查零以在代码中出于一个或多个可能的原因,例如:
是否有一种体面,合理的便携方式可以在不完全关闭警告的情况下使警告静音?
如果合理的话,那些依赖于'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
Run Code Online (Sandbox Code Playgroud)
或者在这种情况下,您可以使用我的首选版本:
return (val-LOWER_BOUND <= UPPER_BOUND-LOWER_BOUND);
Run Code Online (Sandbox Code Playgroud)
编辑:我要去承担,如果some_typedef不知道是特定的符号性的,然后UPPER_BOUND和LOWER_BOUND必须都为正.否则你会some_typedef因为晋升为无人签名而得到非常古怪的结果.因此,您可以随时安全地使用:
return ((uintmax_t)val-LOWER_BOUND <= UPPER_BOUND-LOWER_BOUND);
Run Code Online (Sandbox Code Playgroud)
这通常由编译指示控制。对于 MSVC,您有#pragma warning诊断编译指示(诚然,它不允许像 MSVC 那样对警告进行细粒度控制,但这就是您所拥有的全部)。
两者都允许推送/弹出机制仅更改几行代码的警告。