【问题标题】:recvfrom: warning: conversion to ‘size_t’ from ‘ssize_t’ may change the sign of the resultrecvfrom:警告:从“ssize_t”转换为“size_t”可能会改变结果的符号
【发布时间】:2017-11-21 18:23:25
【问题描述】:

如何修复 gcc (Debian 4.9.2-10) 4.9.2 编译器警告

警告:从“ssize_t”转换为“size_t”可能会改变 结果 [-Wsign-conversion] recv_len = recvfrom(my_socket, *buf, MESSAGE_MAX_LEN, 0, (struct sockaddr *)&remote_addr, &addr_len);

代码:

int my_socket;
struct sockaddr_storage remote_addr;
socklen_t addr_len = sizeof(remote_addr);

void
socket_listen(
        int (*callback )(),
        char ** buf)
{
  size_t recv_len;
  ...
  *buf = malloc(MESSAGE_MAX_LEN);
  recv_len = recvfrom(my_socket, *buf, MESSAGE_MAX_LEN, 0, (struct sockaddr *)&remote_addr, &addr_len);
  ...
}

【问题讨论】:

  • 这不是很明显吗?使用ssize_t 作为您的recv_len :o
  • 回滚您的编辑,因为现有答案是指recv_len 的声明类型不正确。如果您再次编辑它,请确保不要破坏它。

标签: c


【解决方案1】:

显而易见的解决方法:当然是使用正确的类型:

const ssize_t recv_len = recvfrom(...);

它已签名,因为它需要能够返回负值 (-1) 来表示错误,请参阅the manual page

这些调用返回接收到的字节数,如果发生错误,则返回 -1。当对端执行了有序关闭时,返回值将为 0。

【讨论】:

  • nope: "错误:赋值只读变量'recv_len' recv_len = recvfrom(my_socket, *buf, MESSAGE_MAX_LEN, 0, (struct sockaddr *)&remote_addr, &addr_len);"
  • @Sam 这是正确答案,您将代码 sn-p 编辑为完全不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
相关资源
最近更新 更多