2012-01-05 79 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語法?

爲了記錄在案,我想模仿該方法會像

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

這是冗長和惱人的,看到這裏的一切是C反正。

This is related to this other answer I got today.

回答

8

由於該函數是一個C函數,因此您需要刪除靜態關鍵字,否則在其翻譯單元之外將不可見。一旦你這樣做,你有第一個例子將工作。另外,因爲它是一個C語言函數,它的聲明在@interface之內或之外,並且@implementation的內部或外部的定義對你將如何調用它沒有任何影響。

+0

非常感謝。 – 2012-01-05 22:31:38

5

考慮聲明等價於在全球範圍內的靜態的C函數。這與C++或Java非常不同。此功能沒有類範圍或外部鏈接。

因此,@界面範圍將不是宣佈makePacketList的好地方。該消息表示定義在使用時不可見。

+0

這是否意味着「不要這樣做?」 – 2012-01-05 22:26:56

+1

@Yar這意味着刪除靜態關鍵字。另請參閱我的答案,以便將方法聲明放在'@ interface'中。提示:沒有。 – Joe 2012-01-05 22:27:59

+1

@Yar yes。目前沒有理由在'@interface'中聲明一個函數(static或extern)。它只是一個C函數聲明。 – justin 2012-01-05 22:33:34

1

您需要將該功能移至.m(如果僅從此文件使用此功能纔有意義)或刪除static關鍵字。

+0

如果我刪除static關鍵字,是否需要實例化YarMidiCommon? – 2012-01-05 22:27:28

+1

不,它是一個簡單的C函數,不是obj-c類的一部分。 – Krizz 2012-01-05 22:30:29