代码之家  ›  专栏  ›  技术社区  ›  Smit Ycyken

如何摆脱警告C4244/C4267转换?

  •  -2
  • Smit Ycyken  · 技术社区  · 6 年前

    是否可以消除试图从中强制转换的编译器警告 SOCKET int 或来自 size_t int 使用winsock2函数 sendto , select 等?可以有一个共同的方法吗?(Windows,MSVC15)

    例子:

    C4267从“size_t”转换为“int”,可能丢失数据:

    sendto(_socket, managedPtr, _bufferSize, NULL, PSOCKADDR(&_sockaddr), sizeof(_sockaddr)) ______________________________ ~~~~~~~~~~~~~~

    C4244从“socket”转换为“int”,可能丢失数据:

    select(_socket + 1, &readfds, nullptr, nullptr, GetTV())

    ____ ~~~~~~~~~___________________

    2 回复  |  直到 6 年前
        1
  •  0
  •   Yastanub    6 年前

    森托 :编译器可能会对此发出警告,因为您试图构建64位应用程序。这样, size_t 将是64位宽的类型,int最多为32位。若要解决此问题,请尝试将结果明确地转换为 int 所以编译器知道这是故意的。此功能也可以替换为 send 在这里阅读 MSDN “send to函数通常用于无连接套接字,将数据报发送到由to参数标识的特定对等套接字。即使无连接套接字以前已连接到特定地址,to参数也仅覆盖该特定数据报的目标地址。在面向连接的套接字上,to和tolen参数被忽略,使sendto等价于 send “所以也许也要检查一下。

    选择 作为 MSDN 声明忽略第一个参数,但与Berkeley套接字保持兼容。显然,微软希望为unix系统提供简单的代码移植性,并因此设计了符合posix标准的api,这样代码几乎可以复制粘贴(显然有一些细微的变化) Read more here . 所以如果你用 winsock2 忽略此参数并将其设置为 0 或任何整数。如果要移植应用程序,请复制代码并传递套接字的文件描述符,而不是 .

        2
  •  0
  •   Ted Lyngmo    6 年前

    是的,有可能:

    SOCKET s;
    int i = static_cast<int>(s);
    

    对于 int 确保你的价值不是 > std::numeric_limits<int>::max() 应该可以的 static_cast<int>(value) .

    sendto(_socket, managedPtr, _bufferSize, NULL,
           &_sockaddr, static_cast<int>(sizeof(_sockaddr)));
    
    select(static_cast<int>(_socket)+1, ...); // the nfds parameter is ignored on Windows