gpt4 book ai didi

对理解和消除 -Wsign-compare gcc 的警告感到困惑

转载 作者:行者123 更新时间:2023-12-04 12:26:33 25 4
gpt4 key购买 nike

这是我正在尝试编译的函数:

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);
}

和 gcc 的提示:
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_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;
}

关于对理解和消除 -Wsign-compare gcc 的警告感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59204768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com