为什么WSAStringToAddress采用非const AddressString?

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*参数吗?


下面是更后面的故事的......我试图用WSAStringToAddressinet_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)

Aru*_*pur 0

  1. Windows 是 C API,因此定义的 C 字符串"Some string"不是常量。C++ 通过使它们保持不变来改变这一点。
  2. 是的,使用以下方法消除常量是完全安全的const_cast<LPTSTR>("my string").