这是我要编译的函数:

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_tosize类型的size_t的输出进行比较。这就是有符号/无符号比较发生的地方。然后,此比较的结果从size进行次跟踪,因此每次仅减少1。

在作业周围添加括号:

((size -= write(buf->fd, src, size)) < osize)


当您现在将size_tsize_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;
    }

09-06 11:37