强制转换ssize_t或size_t



在我在项目中使用的源文件中,ssize_tsize_t变量之间存在比较:

ssize_t sst;
size_t st;
if(sst == st){...}

我想去掉警告:

warning: comparison between signed and unsigned integer expressions

但是我不确定,我应该将哪个变量转换为另一个?

if((size_t)sst == st){...}

if(sst == (ssize_t)st){...}

什么更安全、更好、更清洁?由于

这个问题没有唯一的正确答案。有几种可能的答案,这取决于你对先验对这些变量可能采取的值的了解。

  • 如果你知道sst是非负的,那么你可以安全地将sst转换为size_t,因为这不会改变值(顺便说一句,这是如果你根本没有转换会发生的事情)。

  • 如果sst可能是负的,但你知道st永远不会大于SSIZE_MAX,那么你可以安全地将st转换为ssize_t,因为这不会改变值。

  • 如果sst可能是负的,并且st可能大于SSIZE_MAX,则两个强制转换都不正确;任何一个都可能改变值,导致不正确的比较。相反,您将执行以下if (sst >= 0 && (size_t)sst == st)

如果你不能绝对确定适用前两种情况之一,请选择第三种选项,因为它在任何情况下都是正确的。

只要两个值都符合ssize_t的正可表示范围,就可以正常工作。

如果值,您可能会遇到麻烦-在测试相等之前检查这些情况:

if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st))
{
  ...
}

(我相信c++的人会建议你完全避免C风格的强制转换——我毫不怀疑会有人评论或回答,让你知道在c++中正确的方法。)

相关内容

  • 没有找到相关文章

最新更新