14

我有一个 .cpp/.hpp 文件组合 -> .hpp 文件有 #include ..

我还有一个 .mm/.h 文件组合 -> 如果我在 .mm Objective C++ 文件中包含 .hpp 文件,则没有问题。但是,如果我尝试在 .h(Objective C 头文件)文件中包含 .hpp 文件,则会收到预处理器问题“找不到 iostream”。

除了在我的 Objective C .h 文件中有一个 void* 然后将其转换为 .mm 中包含的类型或将每个 C++ 类型包装在一个 Objective C++ 类型中之外,还有什么办法可以解决这个问题?

我的问题与托尼的问题基本相同(但没有人回答他的问题):

https://stackoverflow.com/questions/10163322/how-to-include-c-header-file-in-objective-c-header-file

4

3 回答 3

25

问题是您必须避免头文件中的所有 C++ 语义以允许普通的 Objective-C 类包含它。这可以使用不透明指针来完成。

CPPClass.h

class CPPClass
{
public:
    int getNumber()
    {
        return 10;
    }
};

对象CPP.h

//Forward declare struct
struct CPPMembers;

@interface ObjCPP : NSObject
{
    //opaque pointer to store cpp members
    struct CPPMembers *_cppMembers;
}

@end

对象CPP.mm

#import "ObjCPP.h"
#import "CPPClass.h"

struct CPPMembers {
    CPPClass member1;
};

@implementation ObjCPP

- (id)init
{
    self = [super init];
    if (self) {
        //Allocate storage for members
        _cppMembers = new CPPMembers;

        //usage
        NSLog(@"%d", _cppMembers->member1.getNumber());
    }

    return self;
}

- (void)dealloc
{
    //Free members even if ARC.
    delete _cppMembers;

    //If not ARC uncomment the following line
    //[super dealloc];
}

@end
于 2012-12-04T13:54:48.243 回答
4

要在 Objective-C++ 头文件中使用 C++,请确保:

  1. 有一对.h/.mm (Objective-C++)
  2. 在文件的标识中,将类型设置为 Objective-C++ Source(它应该是自动的)
  3. Include the considered file only from Objective-C++ source files. This point is obvious but can be very quickly forgotten and hard to track down
于 2014-07-04T08:05:34.803 回答
0

#include 指令只包含文本;Objective C 唯一会抱怨的是,如果包含文件中的某些内容不是有效的 Objective C。

就你而言,它会给你答案;在 Objective C 中找不到 iostream.h 头文件。找到该文件的引用位置并删除#include。

于 2012-12-03T20:57:52.633 回答