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

时间:2018-11-19 15:13:13

标签: c++ compiler-warnings winsock2

是否有可能使用诸如SOCKET之类的winsock2函数摆脱试图从int投射到size_t或从int投射到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 个答案:

答案 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

答案 1 :(得分:0)

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

选择:因为MSDN表示第一个参数被忽略,但保留为与berkeley插座兼容。显然,Microsoft希望为UNIX系统提供简单的代码可移植性,因此设计了自己的API以适合POSIX标准,因此几乎可以仅复制粘贴代码(显然有一些细微变化)Read more here。因此,如果您使用winsock2,请忽略此参数并将其设置为0或任何整数。如果要移植您的应用程序,请复制代码并传递套接字的文件描述符,而不是0