【发布时间】:2019-06-03 17:30:03
【问题描述】:
我有一个套接字通信程序。该协议是任何写入错误都是致命的,因此应该关闭连接。我的 I/O 代码如下所示:
auto const toWrite = buf.size() * sizeof(buf[0]);
auto nWritten = ::write(fd, buf.data, toWrite);
if (toWrite != nWritten)
{
closeTheSocket();
}
此代码在布尔测试中给出warning: comparison between signed and unsigned integer expressions。
我了解有符号与无符号比较的大/小比较的弊端,但在这里这是不可避免的。 ::write 系统调用的签名是
#include <unistd.h> ssize_t write(int fd, const void *buf, size_t count);
换句话说,我的toWrite 变量是正确无符号的,而返回的nWritten 是有符号的(-1 表示错误)。我不在乎;除了完全传输之外的任何东西对连接都是致命的。另外,我不明白有符号/无符号之间的(不)相等测试是如何危险的。
我看过here、here、here和here,但问题都是关于小于比较的问题,答案都是“不要那样做”。
This question 询问有关消除警告的问题,但大锤“消除所有签名/未签名”比较是不可取的。
我应该如何以尽可能不打扰的方式使仅此警告静音?
【问题讨论】:
-
static_cast<ssize_t>(toWrite) -
“我应该如何以尽可能不打扰的方式使仅此警告静音?”在您确定的地方使用显式强制转换你在做。
-
问题不仅仅是“强制转换”,因为他必须能够检测到
::write的显式失败条件,并且您必须确保强制转换不会丢失有用的信息,因此您有投射到较大的正范围内。 -
我不明白您为什么不应该将
auto const toWrite = ...更改为ssize_t const toWrite = ... -
@PaulSanders 因为系统调用
::write()需要一个无符号参数。
标签: c++ unsigned gcc-warning