将int传递给核心电话obj c中的void(*)(void)类型参数的不可压缩指针类型

Posted

技术标签:

【中文标题】将int传递给核心电话obj c中的void(*)(void)类型参数的不可压缩指针类型【英文标题】:incompactable pointer type passing int to parameter of type void(*)(void) in coretelephony obj c 【发布时间】:2015-05-16 11:22:57 【问题描述】:

coreTelephony.h中定义的函数是

void _CTServerConnectionRegisterForNotification(CTServerConnectionRef,void *,void(*callback)(void));

然后我尝试调用这个函数

int x = 0; //placehoder for callback
_CTServerConnectionRegisterForNotification(conn,kCTCellMonitorUpdateNotification,&x);

返回错误

不兼容的指针类型将 int 传递给核心电话 obj c 中 void(*)(void) 类型的参数

我错过了什么?

【问题讨论】:

你为什么要恢复之前的编辑? 您在哪里找到了该声明?错了 【参考方案1】:

_CTServerConnectionRegisterForNotification 的第三个参数是一个函数指针,你传递一个指向int 的指针。即使您使用强制转换成功了,稍后当连接需要通知您时,它也会尝试使用您作为函数传递的值,并且由于它不是函数,您很可能会看到崩溃。

使用非 int 函数:

void callback()


然后在您当前的代码中:

_CTServerConnectionRegisterForNotification(conn,kCTCellMonitorUpdateNotification,&callback);

【讨论】:

【参考方案2】:

这里,_CTServerConnectionRegisterForNotification() 的第三个参数是指向一个函数的指针

void 返回类型 不接受任何参数。

在这种情况下,您不能传递int 的地址。这是错误的,会导致undefined behavior。

【讨论】:

感谢您的回复...那我该如何传递 int 变量? @sai 它被称为reply,而不是replay。 :-) 你为什么首先传递一个指向int 的指针? :) 我刚试过 _CTServerConnectionRegisterForNotification(conn,kCTCellMonitorUpdateNotification,x);但它返回相同的警告 这是我的代码 void register_notification() if (!mach_port || !conn) return; void *libHandle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_LOCAL | RTLD_LAZY);无效 *kCTCellMonitorUpdateNotification = dlsym(libHandle, "kCTIndicatorsSignalStrengthNotification"); if(kCTCellMonitorUpdateNotification== NULL) NSLog(@"找不到 kCTCellMonitorUpdateNotification");诠释 x = 0; //回调的占位符 _CTServerConnectionRegisterForNotification(conn,kCTCellMonitorUpdateNotification,&x); 最后一行返回错误 @sai 你没有明白这一点。为什么你要传递的东西不是函数指针

以上是关于将int传递给核心电话obj c中的void(*)(void)类型参数的不可压缩指针类型的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C# 中的方法指针传递给 C 库?

为啥可以将 void(*)(int x, int y) 传递给期望 void(*)() 的 attachInterrupt?

将指针传递给函数不是在 C 中通过引用传递吗?

Ruby - 将方法作为回调传递给 DLL 库

OpenCL API 中的类型转换 (void *)&c_mem_obj

C将int数组指针作为参数传递给函数