繁体   English   中英

C ++和Objective-C

[英]C++ and Objective-C

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

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

{}

请帮助我修复它。

如果我对您的理解正确,那么您有一个C ++头文件( .hpp )要包含在Objective-C文件中。 不幸的是,您不能直接这样做。 您将不得不使用一种解决方法。

最简单的方法是将每个包含此C ++头文件的Objective-C文件( .m )的编译选项(直接或间接)更改为被编译为Objective-C ++文件。 可以通过将文件重命名为.mm扩展名或更改文件的编译器选项来完成。

如果这对您有用,那么这将是最简单的,但是Objective-C ++并不是Objective-C的完整超集(因为C ++不是C的超集),并且某些有效的Objective-C也是无效的Objective-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 ++标头。

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

你错过了;

而且您的编译器似乎无法识别C ++关键字class ,这很奇怪。 您很可能缺少一些东西; 在此类定义或其他语法错误之前,但在此之前。

该标头可能是从Objective-C(.m扩展名)源代码文件中包含的。 包含该标头的源代码文件必须是目标c ++,即以.mm结尾,或者您可以通过显式更改“将源代码编译为...”设置来强制目标c ++。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM