gpt4 book ai didi

c++ - 从 Objective-C++ 转换为 Objective-C

转载 作者:行者123 更新时间:2023-11-28 01:09:06 25 4
gpt4 key购买 nike

我在 .mm 文件中有这段代码

void MyMIDINotifyProc(const MIDINotification *message, void *refCon);

这条线

MIDIClientCreate((CFStringRef)@"MidiMonitor MIDI 客户端", MyMIDINotifyProc, self, &client);

然后从 CoreMIDI 调用 MyMIDINotifyProc。

在不将文件扩展名更改为 .m 的情况下,我将其转换为 Obj-C 签名:

@interface MidiInput (Private) 
-(void) MyMIDINotifyProc:(const MIDINotification *)message reference:(void *)refCon;
@end

编译,但我不知道如何处理 MIDIClientCreate 行。照原样,它生成 "MyMIDINotifyProc"was not declared in this scope。它应该是 void * 类型...并且文档 100% 清楚它是 A refCon passed back to notifyRefCon ( link )。

这个问题可以单独在 Obj-C 中解决吗?我想我必须将 C++ 的东西翻译成 C,在这种情况下我会不理会它。

最佳答案

MIDIClientCreate 需要一个普通的 C 函数作为其回调。您不能将它传递给 Objective-C 方法,因为调用约定不同(在 C 术语中,Objective-C 方法的前两个参数是 self_cmd - 选择器 - 对于普通的 C 函数来说不会存在)。

解决这个问题的通常方法是创建一个 C 函数作为垫片并显式地将 self 作为参数传递。然后 shim 函数立即发送 objective-C 消息。我不熟悉这个库,但看起来 refCon 是专为此类事情设计的参数。因此,在您的 .m 文件中,您需要这样的函数。

static void MyMIDINotifyProc(const MIDINotification *message, void *refCon)
{
[(id) refCon MIDINotify: message];
}

你还需要一个方法来做实际的事情:

-(void) MIDINotify: (const MIDINotification*) message
{
// do stuff
}

然后您完全按照原来的方式调用 MIDIClientCreate。

关于c++ - 从 Objective-C++ 转换为 Objective-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4423166/

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