将文件重命名为 .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
)。
此代码在 .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
)。