gpt4 book ai didi

objective-c - 将文件重命名为 .mm 后如何进行 Objective C 样式分配

转载 作者:搜寻专家 更新时间:2023-10-30 20:24:38 24 4
gpt4 key购买 nike

此代码在 .m 文件中编译,但不在 .mm 文件中编译:

CFDataRef nativeSocket = CFWriteStreamCopyProperty((CFWriteStreamRef)outputStream, kCFStreamPropertySocketNativeHandle);
CFSocketNativeHandle *sock = (CFSocketNativeHandle *)CFDataGetBytePtr(nativeSocket);

错误信息是:

Cannot initialize a variable of type 'CFDataRef' (aka 'const __CFData *') with an rvalue of type 'CFTypeRef' (aka 'const void *')

如果我将 nativeSocket 的类型更改为 CFTypeRef,则错误消息变为:

Candidate function not viable: cannot convert argument of incomplete type 'CFTypeRef' (aka 'const void *') to 'CFDataRef' (aka 'const __CFData *')

请告诉我如何解决这个问题。我似乎猜不出要用谷歌搜索什么。

谢谢!

最佳答案

您只需将 CFWriteStreamCopyProperty() 的结果转换为正确的类型:

CFDataRef nativeSocket = (CFDataRef)CFWriteStreamCopyProperty((CFWriteStreamRef)outputStream, kCFStreamPropertySocketNativeHandle);
CFSocketNativeHandle *sock = (CFSocketNativeHandle *)CFDataGetBytePtr(nativeSocket);

不过,以这种方式提取 native 句柄可能更安全:

CFSocketNativeHandle sock;
CFDataGetBytes(nativeSocket, CFRangeMake(0, sizeof(sock)), (UInt8*)&sock);

这避免了数据对象的字节指针未对齐的任何问题。此外,它还确保您不会在数据对象被释放后尝试隐式引用字节指针(通过执行 *sock)。

关于objective-c - 将文件重命名为 .mm 后如何进行 Objective C 样式分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32643917/

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