![](/img/trans.png)
[英]cannot convert ‘std::string’ to ‘char**’ for argument ‘1’ to ‘__ssize_t getline(char**, size_t*, FILE*)’
[英]Cast ssize_t or size_t
在我在项目中使用的源文件中, ssize_t
和size_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
转换就会发生这种情况)。
如果sst
可能是负数但您知道st
将永远不会大于SSIZE_MAX
,那么您可以安全地将st
为ssize_t
,因为这不会更改该值。
如果sst
可能是负数,并且st
可能大于SSIZE_MAX
,则两个SSIZE_MAX
都不正确; 任何一个都可能改变该值,导致不正确的比较。 相反, if (sst >= 0 && (size_t)sst == st)
。
如果您不确定前两种情况之一是否适用,请选择第三种选项,因为它在所有情况下都是正确的。
只要两个值都适合ssize_t
的正可表示范围,两者都可以正常工作。
如果任何一个值没有 ,你可能会遇到麻烦 - 在测试相等性之前检查这些情况:
if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st))
{
...
}
(我确信C ++人员会建议你完全避免使用C风格的演员 - 我毫不怀疑有人会发表评论或回答,让你知道在C ++中这样做的正确方法。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.