铸造ssize_t供或为size_t(Cast ssize_t or size_t)

2019-08-31 11:49发布

在我用我的项目,该项目的源文件,还有的比较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){...}

什么是更安全,更好,更清洁? 谢谢

Answer 1:

有没有一个正确的回答这个问题。 有几种可能的答案,取决于你知道什么关于这些变量可以采取的值先验

  • 如果你知道sst非负,那么你可以放心地投sstsize_t ,因为这不会改变的值(顺便说一句,这是如果你没有投在所有发生的事情)。

  • 如果sst可能是负面的,但你知道, st永远不会大于SSIZE_MAX ,那么你可以放心地投stssize_t ,因为这不会改变价值。

  • 如果sst可能是负数, st可能会大于SSIZE_MAX ,然后也不要把正确; 任一个可以改变值,从而导致不正确的比较。 相反,你会做以下if (sst >= 0 && (size_t)sst == st)

如果你不完全肯定的前两种情况之一者,选择第三个选项,因为它是在所有情况下是正确的。



Answer 2:

只要这两个值适合的正面描述范围要么将正常工作ssize_t

如果任一值 ,你可能由此陷入困境结束了-测试相等之前检查这些情况:

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

(我敢肯定,C ++的人会建议你避免C风格完全投 - 我毫无疑问会有人发表评论或回答,让你知道该怎么做,在C ++正道)



文章来源: Cast ssize_t or size_t