2010-12-12 2 views
0

Objective-C++에서 Objective-C로 번역

이 코드는 .mm

이 줄

MIDIClientCreate((CFStringRef)@"MidiMonitor MIDI Client", MyMIDINotifyProc, self, &client);

다음 MyMIDINotifyProc CoreMIDI에서 가져옵니다 가져옵니다.

파일 확장명을 .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 언어로 번역해야한다고 생각합니다.이 경우에는 그냥 그대로 두어야합니다.

답변

3

MIDIClientCreate은 일반적인 C 함수를 콜백으로 간주합니다. 호출 규칙이 다르므로 Objective-C 메서드를 전달할 수 없습니다 (C 언어의 경우 Objective-C 메서드의 처음 두 매개 변수는 보통 C 함수에는 없기 때문에 self_cmd - 선택자 임).).

shim으로 작동하고 self를 매개 변수로 명시 적으로 전달하는 C 함수를 만드는 일반적인 방법이 있습니다. 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를 호출합니다.

+0

감사합니다. +1하고 일단 대답하면 (또는 일단 XCode가 수행하면)이 대답을 받아 들일 것입니다. –