2011-08-31 70 views
0

我需要使用C++的文件在我的项目,它被称为CAXException.hpp,和行项目的目标“编译来源” - “根据文件类型”不是的Objective-C++。但是,当它编译它总是显示我的错误error: expected '=', ',', ';', 'asm' or '__attribute__' before 'CAXException' 代码:C++和Objective-C

class CAXException //<-------error here 

{} 

请帮我解决这个问题..

+1

究竟是哪一个,客观的C还是C++? –

+0

[This answer](http://stackoverflow.com/questions/525609/use-c-with-cocoa-instead-of-objective-c/529017#529017)有很多关于你需要做什么的信息在Objective C中使用C++。同一页面上的其他答案也应该非常有用 - 无论评论中是否有火焰战争。 –

+0

如果遵循约定,则.hpp文件将作为头文件包含在其他翻译单元中。请编辑您的问题,告诉我们更多关于* that *文件的信息:是C,C++,Objective-C还是Objective-C++?你如何包含.hpp文件? –

回答

2

如果我理解正确的话,你必须要从Objective-C的文件,包括C++头文件(.hpp)。不幸的是,你不能直接这样做。您必须使用解决方法。

最简单的方法是更改​​包含此C++头文件(直接或间接)编译为Objective-C++文件的每个Objective-C文件(.m)的编译选项。这可以通过将文件重命名为.mm扩展名或通过更改文件编译器的选项来完成。 Objective-C++不是Objective-C的完整超集(因为C++不是C的超集),并且某些有效的Objective-C无效Objective-C是无效的Objective-C不支持Objective-C的超集(因为C++不是C的超集) C++(如果C++关键字用作变量名称)。

如果发生这种情况,你必须创建一个Objective-C包装器类,以在Objective-C++的实现,只是委托给C++类。这是创建一个CAXExceptionWrapper.h Objective-C的文件,其中包含类似:

@interface CAXExceptionWrapper { 
    @private 
    void* _CAXExceptionImpl; 
} 
- (id)init; 
// ... 
@end 

和含有`CAXExceptionWrapper.mm”的Objective-C++文件:

@import "CAXException.hpp" 
@implementation CAXExceptionWrapper 
- (id)init { 
    if ((self = [super init])) { 
     _CAXException = new CAXExceptionWrapper; 
    } 
    return self; 
} 
// ... 
@end 

然后在你的Objective-C的文件,包含包装Objective-C头文件而不是C++头文件。

1
class CAXException //<-------error here 
{}; 
^^^ 

你缺少的;

和你的编译器似乎不识别C++关键字class,这很奇怪。最有可能的是,在这个类定义或其他一些语法错误之前,但在此之前,您错过了一些;

+0

我设定了它。效果 - 0 – LightNight

+0

@mazder错误在该行之前。很有可能你在上面声明的类的最后还缺少';'。 –

+0

当我在项目目标“编译源代码为” - “Objective C++”中设置此文件编译正常,其他文件(Facebook连接和Twitter库)中仅有约100个其他错误 – LightNight

1

该头部可能包含在Objective-C(.m扩展名)源代码文件中。包含该头文件的源代码文件必须是一个客观的C++文件,即以.mm结尾,或者可以通过明确更改“Compile sources as ...”设置强制客观的C++。