Właściwie użyj Objective C ++
Koduję aplikację na iOS, a ostatnio # zawarłem plik nagłówkowy C ++ w pliku implementacji Objective C (.m). Zmieniłem rozszerzenie z .m na .mm i oczekiwałem, że wszystko będzie działało sprawnie.
Nieoczekiwanie otrzymałem wiele błędów kompilatora w pliku .h mojej klasy C ++.
Takie jak: „C ++ wymaga specyfikatora typu dla wszystkich deklaracji” i „Zduplikowany element ...”.
Czy ktoś wie, co może to powodować?
Edytuj - Dodałem plik nagłówkowy C ++ dla kontekstu:
<code>#ifndef __CAAudioUnitOutputCapturer_h__ #define __CAAudioUnitOutputCapturer_h__ #include <AudioToolbox/ExtendedAudioFile.h> /* Class to capture output from an AudioUnit for analysis. example: CFURL fileurl = CFURLCreateWithFileSystemPath(NULL, CFSTR("/tmp/recording.caf"), kCFURLPOSIXPathStyle, false); CAAudioUnitOutputCapturer captor(someAU, fileurl, 'caff', anASBD); { captor.Start(); ... captor.Stop(); } // can repeat captor.Close(); // can be omitted; happens automatically from destructor */ class CAAudioUnitOutputCapturer { public: enum { noErr = 0 }; CAAudioUnitOutputCapturer(AudioUnit au, CFURLRef outputFileURL, AudioFileTypeID fileType, const AudioStreamBasicDescription &format, UInt32 busNumber = 0) : mFileOpen(false), mClientFormatSet(false), mAudioUnit(au), mExtAudioFile(NULL), mBusNumber (busNumber) { CFShow(outputFileURL); OSStatus err = ExtAudioFileCreateWithURL(outputFileURL, fileType, &format, NULL, kAudioFileFlags_EraseFile, &mExtAudioFile); if (!err) mFileOpen = true; } void Start() { if (mFileOpen) { if (!mClientFormatSet) { AudioStreamBasicDescription clientFormat; UInt32 size = sizeof(clientFormat); AudioUnitGetProperty(mAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, mBusNumber, &clientFormat, &size); ExtAudioFileSetProperty(mExtAudioFile, kExtAudioFileProperty_ClientDataFormat, size, &clientFormat); mClientFormatSet = true; } ExtAudioFileWriteAsync(mExtAudioFile, 0, NULL); // initialize async writes AudioUnitAddRenderNotify(mAudioUnit, RenderCallback, this); } } void Stop() { if (mFileOpen) AudioUnitRemoveRenderNotify(mAudioUnit, RenderCallback, this); } void Close() { if (mExtAudioFile) { ExtAudioFileDispose(mExtAudioFile); mExtAudioFile = NULL; } } ~CAAudioUnitOutputCapturer() { Close(); } private: static OSStatus RenderCallback( void * inRefCon, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData) { if (*ioActionFlags & kAudioUnitRenderAction_PostRender) { CAAudioUnitOutputCapturer *This = (CAAudioUnitOutputCapturer *)inRefCon; static int TEMP_kAudioUnitRenderAction_PostRenderError = (1 << 8); if (This->mBusNumber == inBusNumber && !(*ioActionFlags & TEMP_kAudioUnitRenderAction_PostRenderError)) { OSStatus result = ExtAudioFileWriteAsync(This->mExtAudioFile, inNumberFrames, ioData); if (result) DebugMessageN1("ERROR WRITING FRAMES: %d\n", (int)result); } } return noErr; } bool mFileOpen; bool mClientFormatSet; AudioUnit mAudioUnit; ExtAudioFileRef mExtAudioFile; UInt32 mBusNumber; }; #endif // __CAAudioUnitOutputCapturer_h__ </code>