1

我还是 C 的新手,但试图通过一个小型 MIDI 音频单元(在 Xcode 4.3.3 中)更好地理解它。我整天都在寻找这个问题的答案,但仍然不明白到底是什么问题。这是有问题的代码:

//MyMIDINotifyProc.h

#ifndef MIDIInstrumentUnit_CallbackProcs_h
#define MIDIInstrumentUnit_CallbackProcs_h

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

#endif


//MyMIDINotifyProc.c

#include <CoreMIDI/CoreMIDI.h>
#include "MyMIDINotifyProc.h"

void MyMIDINotifyProc (const MIDINotification *message, void *refCon) {
//manage notification
}

在标题定义中,我得到了这个:

! Cannot combine with previous 'struct' declaration specifier

我确保定义匹配并尝试重命名它们,但我仍然在我的 .c 文件中得到它:

! Redefinition of 'MyMIDINotifyProc' as different kind of symbol

这将 .h 定义指向“以前的定义”。

我知道 CoreMIDI 框架中的 MIDIServices.h 定义:

typedef void
(*MIDINotifyProc)(const MIDINotification *message, void *refCon);

但我不明白是否/为什么会导致错误。如果有人能提供一些帮助,我将不胜感激。

4

2 回答 2

1

您忘记包含<CoreMIDI/CoreMIDI.h>MyMIDINotifyProc.h头文件中。

于 2012-12-15T04:55:25.573 回答
0

更多信息在这里-但我认为您缺少我认为 typedef 所在的 MidiServices.h 文件:

http://disanji.net/iOS_Doc/#documentation/CoreMidi/Reference/MIDIServices_Reference/Reference/reference.html

在标头中的第一个错误之后,源文件中的错误变得毫无意义。

/*MIDIClientCreate - Creates a MIDIClient object. */

OSStatus MIDIClientCreate (
CFStringRef     name,
MIDINotifyProc  notifyProc,
void            *notifyRefCon,
MIDIClientRef   *outClient
);

MIDINotifyProc 当 MIDI 状态改变时调用。

typedef void (*MIDINotifyProc) ( const MIDINotification *message, void *refCon );

如果您将回调函数命名为 MyMIDIStateChangedHander,您可以像这样声明它:

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

参数 message 有关状态更改的信息。

refCon 您提供给 MIDIClientCreate 函数的上下文。

讨论 MIDINotifyProc 回调函数在调用 MIDIClientCreate 函数的同一线程上调用。

可用性 适用于 iOS 4.2 及更高版本。在 MIDIServices.h 中声明

于 2012-12-15T06:08:07.870 回答