gpt4 book ai didi

winapi - 为什么 WSAStringToAddress 采用非常量 AddressString?

转载 作者:行者123 更新时间:2023-12-02 09:32:40 24 4
gpt4 key购买 nike

WSAStringToAddress 的 Windows 文档状态:

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 char*

我的第一个问题是,为什么 WSAStringToAddress 采用非常量指针?

我的第二个问题是,抛弃常量是否安全? WSAStringToAddress 会修改 char* 参数吗?

<小时/>

这里有更多背景故事...我尝试在 inet_addr 替换中使用 WSAStringToAddress,因为在当代版本的 Visual Studio 中已弃用警告。

这是一个问题中详细说明的相同问题 answer provided by Petar 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)
...
}

最佳答案

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

关于winapi - 为什么 WSAStringToAddress 采用非常量 AddressString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39952781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com