jww*_*jww 6 parameters winapi const winsock2
WSAStringToAddress的Windows文档指出:
INT WSAAPI WSAStringToAddress(
_In_ LPTSTR AddressString,
_In_ INT AddressFamily,
_In_opt_ LPWSAPROTOCOL_INFO lpProtocolInfo,
_Out_ LPSOCKADDR lpAddress,
_Inout_ LPINT lpAddressLength
);
Run Code Online (Sandbox Code Playgroud)
AddressString一个_In_参数,而不是一个_Inout_参数.我不清楚为什么API采用非const指针,并导致编译失败,因为我有一个const char*.
我的第一个问题是,为什么WSAStringToAddress采用非常量指针?
我的第二个问题是,将常数抛弃是否安全?会WSAStringToAddress修改char*参数吗?
下面是更后面的故事的......我试图用WSAStringToAddress在inet_addr更换由于在Visual Studio中的当代版本弃用警告.
这是PetarKorponaić提供的答案问题中详述的相同问题.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)
...
}
Run Code Online (Sandbox Code Playgroud)
"Some string"不是常量。C++ 通过使它们保持不变来改变这一点。const_cast<LPTSTR>("my string").| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |