如何摆脱警告C4244/C4267转换



是否可以使用sendtoselect等winsock2函数来消除试图从SOCKET强制转换为int或从size_t强制转换为int的编译器警告?可以有一个共同的方法吗?(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())

_______~~~~~~

sendTo:编译器可能会对此发出警告,因为您试图构建一个64位应用程序。因此,size_t将是64位宽的类型,int最多为32位。要解决此问题,请尝试将结果显式转换为int,以便编译器知道这是有意的。此外,此功能可能会被send取代,如MSDN所示sendto函数通常用于无连接套接字,将数据报发送到由to参数标识的特定对等套接字。即使无连接套接字以前连接到特定地址,to参数也只覆盖该特定数据报的目标地址。在面向连接的套接字上,to和tolen参数被忽略,使dto相当于发送。"所以也许也要检查一下。

选择:正如MSDN所说,第一个参数被忽略,但保留为与berkeley套接字的兼容性。显然,微软希望为UNIX系统提供简单的代码可移植性,因此设计了符合POSIX标准的API,这样代码几乎只需复制粘贴即可(显然有一些细微的更改(阅读更多信息。因此,如果使用winsock2,请忽略此参数并将其设置为0或任何整数。如果你想移植你的应用程序,复制你的代码并传递一个套接字的文件描述符,而不是0

是的,有可能:

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

最新更新