Windows文件WSAStringToAddress指出:
INT WSAAPI WSAStringToAddress(
_In_ LPTSTR AddressString,
_In_ INT AddressFamily,
_In_opt_ LPWSAPROTOCOL_INFO lpProtocolInfo,
_Out_ LPSOCKADDR lpAddress,
_Inout_ LPINT lpAddressLength
);
AddressString
是 _In_
参数,而不是 _Inout_
参数。我不清楚为什么该API会采用非const指针,并且由于我有一个const char*
而导致编译失败。我的第一个问题是,为什么
WSAStringToAddress
使用非常量指针?我的第二个问题是,放弃常驻性是否安全?
WSAStringToAddress
会修改char*
参数吗?这里有更多的背景故事...由于现代版本的Visual Studio中已弃用了警告,因此我试图在
WSAStringToAddress
替换中使用inet_addr
。这是一个带有answer provided by Petar Korponaić的问题中详述的相同问题。科尔波奈奇(Korponaić)遇到了同样的问题。其额外副本的原因:
int inet_pton(int af, const char *src, void *dst)
{
struct sockaddr_storage ss;
int size = sizeof(ss);
char src_copy[INET6_ADDRSTRLEN+1];
ZeroMemory(&ss, sizeof(ss));
/* stupid non-const API */
strncpy (src_copy, src, INET6_ADDRSTRLEN+1);
src_copy[INET6_ADDRSTRLEN] = 0;
if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0)
...
}
最佳答案
"Some string"
的C字符串不是恒定的。 C++通过使它们不变来改变这种情况。 const_cast<LPTSTR>("my string").
抛弃constness是完全安全的关于winapi - 为什么WSAStringToAddress使用非常量AddressString?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39952781/