【问题标题】:How to deal with forward declaration / #import in Cocoa Touch (Objective-C cross C++) correctly?如何正确处理 Cocoa Touch (Objective-C cross C++) 中的前向声明/#import?
【发布时间】:2010-11-13 00:43:13
【问题描述】:

我正在尝试编写这个头文件:

//@class AQPlayer;

//#import "AQPlayer.h"

@interface AQ_PWN_iPhoneViewController : UIViewController {

    AQPlayer* player;
}

@end

AQPlayer 是一个用 C++ 编写的 .mm 文件。

我试图在这里进行类前向声明​​,但它向我抱怨:

error: cannot find interface declaration for 'AQPlayer'

所以我尝试“#import”头文件,但它抱怨一些完全不正确和奇怪的东西。这是抱怨的错误的一部分:

中包含的文件中
/Users/akaraphan/Desktop/SpecialTopic1/AQ_PWN_iPhone/Classes/AQPlayer.h:51,
                 from /Users/akaraphan/Desktop/SpecialTopic1/AQ_PWN_iPhone/Classes/AQ_PWN_iPhoneViewController.h:12,
                 from /Users/akaraphan/Desktop/SpecialTopic1/AQ_PWN_iPhone/Classes/AQ_PWN_iPhoneAppDelegate.m:10:
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:78: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'CAStreamBasicDescription'
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:230: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:231: error: expected '=', ',', ';', 'asm' or '__attribute__' before '==' token
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:233: error: expected '=', ',', ';', 'asm' or '__attribute__' before '!=' token
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:234: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<=' token
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:235: error: expected '=', ',', ';', 'asm' or '__attribute__' before '>=' token
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:236: error: expected '=', ',', ';', 'asm' or '__attribute__' before '>' token
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:239: error: expected ';', ',' or ')' before '&' token

我错过了什么吗?我不能为此做一个前向声明吗?

【问题讨论】:

    标签: iphone objective-c audioqueueservices cross-language


    【解决方案1】:

    首先,你必须告诉编译器一个文件有 C++ 代码(一个文件也包括一个有 C++ 代码的文件!)。您可以通过将其重命名为 .mm 扩展名来做到这一点(.h 保持不变)。第二种方法是像 Atomoil 说的那样将文件类型设置为 'sourcecode.cpp.objcpp'。

    此外,如果您想对 C++ 类进行前向声明,请使用“class AQPlayer;”,而不是“@class AQPlayer;”。如果这样做,您将收到“找不到 XXX 的接口声明”错误..

    我通常在 .h 文件中包含 C++ 文件,从而无需前向声明,尽管有时您不想这样做。

    【讨论】:

      【解决方案2】:

      我也遇到了完全相同的问题(还试图重用 Apple“SpeakHere”演示中的 AQPlayer c++ 类)。

      似乎编译器感到困惑并尝试将objective-c++编译为objective-c(因此出现了所有错误)。我设法通过右键单击导入 mm 文件的 m 文件并选择“getInfo”来编译它,然后将文件类型更改为“sourcecode.cpp.objcpp”

      【讨论】:

        【解决方案3】:

        我已经将我的 AQ_PWN_iPhoneViewController 设为 .mm 文件。所以不,这不能解决问题。

        这里有更多信息:如果我尝试调用 AQPlayer 实例的方法/函数,将显示错误“错误:找不到 'AQPlayer' 的接口声明”。这是一个例子:

        - (void)viewDidLoad {

        CFStringRef ref = (CFStringRef)[NSTemporaryDirectory() stringByAppendingPathComponent: @"1.mp3"];
        player = new AQPlayer(&ref);
        
        OSStatus result = player->StartQueue(false);
        
        if (result == noErr)
            [[NSNotificationCenter defaultCenter] postNotificationName:@"playbackQueueResumed" object:self];
        

        }

        删除任何像 StartQueue 这样的函数调用将使错误消失,但我确实需要调用该方法!

        【讨论】:

        • 您应该编辑您的原始问题,而不是将其作为答案发布。话虽如此,作为 AQPlayer 一个 obj-c 或 C++ 类?您给 @class AQPlayer; 的前向声明是针对 Obj-C 的,但您的方法调用 player-&gt;StartQueue(false); 是 C++ 语法。对于 C++,您要么想要 class AQPlayer;,要么对于 Obj-C 想要 [player startQueue:NO];
        【解决方案4】:

        正常的做法是:

        // In your .h file...
        @class AQPlayer;
        @interface AQ_PWN_iPhoneViewController : UIViewController {
            AQPlayer *player;
        }
        @end
        
        // In your .mm file (see below why it has to be .mm instead of .m)...
        #import "AQ_PWN_iPhoneViewController.h"
        #import "AQPlayer.h"
        @implementation AQ_PWN_iPhoneViewController
        ...
        @end
        

        您看到的严重错误可能是因为编译器试图将 AQPlayer.h 解析为 Objective-C 而不是 Objective-C++。您可能必须对所有导入 AQPlayer 的源文件使用 .mm,即使该特定类不使用 C++。

        【讨论】:

          猜你喜欢
          • 2011-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-31
          • 2013-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多