2012-01-05 2 views
4

적절한 Obj-C 구문을 사용하여이 방법을 다시 수행 할 수 있지만 Obj-C에서 호출하는 방법에 대해 궁금합니다. 메서드는 다음과 같습니다.Obj-C에서 C 구문을 사용하여 정적 메서드 호출?

@interface YarMidiCommon : NSObject 

static 
MIDIPacketList *makePacketList(Byte *packetBuffer, const UInt8 *data, UInt32 size); 

@end 

그러나이 메서드를 호출하는 방법을 알지 못합니다. 나는 시도했다

Byte packetBuffer[size+100]; 
MIDIPacketList *packetList = makePacketList(packetBuffer, bytes, size); 

그러나 오류는 "내부 연결이 있지만 정의되지 않았습니다." "적절한"Obj-C 문법을 사용하지 않고 이것이 가능합니까? 기록을 위해

, 내가 에뮬레이트 할 방법이 될 것을 여기에 모든 C 어쨌든 같이보고, 자세한 성가신입니다

+ (MIDIPacketList*) makePacketListWithPacketBuffer:(Byte*)packetBuffer data:(const UInt8 *)data size:(UInt32)size; 

있다.

This is related to this other answer I got today.

답변

8

이 함수는 C 함수이므로 정적 키워드를 제거해야합니다. 그렇지 않으면 번역 단위 외부에 표시되지 않습니다. 일단 그렇게하면 첫 번째 예제가 작동합니다. 또한 C 함수로 선언문을 @interface 내부 또는 외부에 배치하고 @implementation 내부 또는 외부 정의는 호출 방법에 차이가 없기 때문에.

+0

감사합니다. –

5

는 전역 정적 C 함수 등가 인 것으로 선언을 고려한다. 이것은 C++ 또는 Java와는 많이 다릅니다. 이 함수에는 클래스 범위 나 외부 링키지가 없습니다.

이와 같이 @interface 범위는 makePacketList을 선언하기에 좋은 장소가 아닙니다. 메시지는 사용자가 정의를 볼 때 보이지 않는다는 것을 의미합니다.

+0

"하지 않습니까?" –

+1

@ Yar 즉, static 키워드를 제거하십시오. 메소드 선언을'@interface '안에 두는 것의 중요성에 대한 답을보십시오. 힌트 : 그것은 아무 것도 아니다. – Joe

+1

@ 예. 현재 @ 인터페이스에서 함수 (static 또는 extern)를 선언 할 이유가 없습니다. 그것은 단지 C 함수 선언입니다. – justin

1

.m (이 파일에서만 사용하는 경우) 기능을 이동하거나 static 키워드를 제거해야합니다.

+0

static 키워드를 제거하면 YarMidiCommon을 인스턴스화해야합니까? –

+1

아니요, obj-c 클래스의 일부가 아닌 일반 C 함수입니다. – Krizz