我有一个Cocoa项目(Mac OS X应用程序),所有Objective-C.我从另一个项目中引入了一个C++类(我知道它可以工作),然后为它创建一个Objective-C包装器.ObjC包装器类使用.mm扩展名.但是,C++头文件包含#include标准C++头文件(<vector>例如),我得到了错误.
最小的例子如下所示.CppClass是C++类,CppWrapper是包装它的ObjC类.
// CppClass.h
#ifndef _CPP_CLASS_H_
#define _CPP_CLASS_H_
#include <vector>
class CppClass
{
public:
CppClass() {}
~CppClass() {}
private:
std::vector<int> my_ints;
};
#endif /* _CPP_CLASS_H_ */
// CppWrapper.h
#import <Foundation/Foundation.h>
#import "CppClass.h"
@interface CppWrapper : NSObject {
CppClass* myCppClass;
}
@end
// CppWrapper.mm
#import "CppWrapper.h"
@implementation CppWrapper
- (id)init
{
self = [super init];
if (self) {
myCppClass = new CppClass;
}
return self;
}
- (void)dealloc
{
delete myCppClass;
[super dealloc];
}
@end …Run Code Online (Sandbox Code Playgroud) 我有一个小的C++应用程序,我导入了Objective-C类.它可用作Objective-C++文件,.mm,但任何包含可能最终包含某些Objective-C标头的标头的C++文件必须重命名为.mm扩展名以获取正确的GCC驱动程序.
有没有办法为Objective-C类编写一个纯粹的C++包装器,或者我可以以某种方式将Objective-C对象分开并将它们分开链接?也许即使Objective-C类成为一个小型库,我可以在编译时静态重新链接?
问题是这个代码是跨平台的,并且在通常不使用Objective-C(即不是Mac)的系统上编译更加困难.即使预处理器命令限制在Windows或Linux上实现Objective-C代码,原始代码仍然具有.mm扩展名,GCC仍将代码视为Objective-C++.