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

How to do objective c style assignments after renaming file to .mm

此代码在 .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 *')

请告诉我如何解决这个问题。我似乎猜不出 google.

的内容

谢谢!

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

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

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

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

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