如何使一个特定的"无符号与零无意义的比较"警告沉默?

Mic*_*urr 8 c warnings

假设我有如下函数:

#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进行无意义的比较.当然这是真的,这是有道理的.

但是,假设我确实希望检查零以在代码中出于一个或多个可能的原因,例如:

  • 虽然边界始终是编译时常量,但它们可能会发生变化(并且宏可能不会"非常"接近函数).例如,可以通过将选项传递给编译器来设置边界.
  • 我可能希望防止以后将typedef更改为signed类型,因为typedef的每次使用都可能在更改时不会被仔细检查.

是否有一种体面,合理的便携方式可以在不完全关闭警告的情况下使警告静音?

如果合理的话,那些依赖于'STATIC_ASSERT()'的功能(可供我使用)是可以接受的.如果类型更改以强制某人查看代码,我可以打破编译.但重要的是要注意,这typeof并非我所针对的所有编译器中都可用的东西.

我特意寻找C语言解决方案,因此模板在这里没有任何用处......

R..*_*R.. 6

如果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_BOUNDLOWER_BOUND必须都为正.否则你会some_typedef因为晋升为无人签名而得到非常古怪的结果.因此,您可以随时安全地使用:

    return ((uintmax_t)val-LOWER_BOUND <= UPPER_BOUND-LOWER_BOUND);
Run Code Online (Sandbox Code Playgroud)


Bli*_*ndy 2

这通常由编译指示控制。对于 MSVC,您有#pragma warning诊断编译指示(诚然,它不允许像 MSVC 那样对警告进行细粒度控制,但这就是您所拥有的全部)。

两者都允许推送/弹出机制仅更改几行代码的警告。

  • `_Pragma` 实际上是 C99,而不是 gcc。 (2认同)