这是我要编译的函数:
static ssize_t output(t_out_buffer *buf, char const *src, size_t size)
{
size_t osize;
osize = size;
while ((size > 0)
&& (size -= write(buf->fd, src, size) < osize))
{
src += osize - size;
buf->count += osize - size;
osize = size;
}
if (osize < size)
return (T_OUT_BUFFER_ERROR);
else
return (buf->count);
}
和海湾合作委员会的抱怨:
t_out_buffer.c:11:42: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
&& (size -= write(buf->fd, src, size) < osize))
^
我假设
size
是无符号的,size -= whateverintiwant
也将是无符号的,因为osize
也是无符号的。我现在假设我错了,但我并不真正理解为什么。此外,您能给我提示以使其静音吗?
最佳答案
此表达式没有按照您的想法进行:
(size -= write(buf->fd, src, size) < osize)
小于运算符
<
的优先级高于复合赋值运算符-=
。因此,上面的解析为:(size -= (write(buf->fd, src, size) < osize))
因此,这会将
write
类型的ssize_t
与osize
类型的size_t
的输出进行比较。这就是有符号/无符号比较发生的地方。然后,此比较的结果从size
进行次跟踪,因此每次仅减少1。在作业周围添加括号:
((size -= write(buf->fd, src, size)) < osize)
当您现在将
size_t
与size_t
进行比较时,警告将消失。但是还有另一个问题。如果
write
返回-1,那么您将减去该值,即如果失败则加1,您应该重构,以便在循环内进行读取,并且仅在成功的情况下才添加结果。
while (size > 0) {
{
ssize_t rval = write(buf->fd, src, size);
if (rval == -1) {
return T_OUT_BUFFER_ERROR;
}
size -= rval;
src += rval;
buf->count += rval;
}