目标 c - 在 Cocoa 项目中使用类时找不到标准C++包含C++

objective c - Can't find standard C++ includes when using C++ class in Cocoa project

本文关键字:C++ 找不到 标准 包含 Cocoa 项目 目标      更新时间:2023-10-16

我有一个Cocoa项目(Mac OS X应用程序),都是Objective-C。 我从另一个项目中提取了一个C++类(我知道它有效),并为它制作了一个 Objective-C 包装器。 ObjC 包装类使用 .mm 扩展名。 但是,C++头文件包含标准C++头文件的#include s(例如<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
// The file that uses CppWrapper
//  TestAppDelegate.m
#import "TestAppDelegate.h"
#import "CppWrapper.h"
@implementation TestAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    myWrapper = [[CppWrapper alloc] init];
}
@end

我得到的错误是 CppClass.h 中vector #include。 错误是

词法或预处理器问题:找不到'vector'文件

这段代码在另一个(所有C++)项目中运行良好,所以我很确定这是一个构建设置,或者我在包装类中做错了什么。 我正在使用 Xcode 4。 我创建了一个默认的Cocoa Mac OS应用程序项目,所有设置都是默认的。

更新:我刚刚意识到,如果我将TestAppDelegate的文件类型设置为Objective-C++(或将其重命名为 TestAppDelegate.mm),它可以工作。 我不明白的是,这个类是纯粹的Objective-C;为什么它必须编译为目标C++? 在我的C++类上有一个Objective-C包装器的全部意义在于,我不必将整个项目构建为Objective-C++。

CppWrapper类的问题在于它没有呈现一个纯粹的Objective-C接口。在CppWrapper.h文件中,你正在导入C++类的头文件,这意味着任何导入包装类的Objective-C类都需要编译为Objective-C++,包括你的TestAppDelegate

相反,您需要执行以下操作来完全隐藏CppWrapper.mm文件中的C++:

//  CppWrapper.h
#import <Foundation/Foundation.h>
@interface CppWrapper : NSObject {
    void *myCppClass;
}
- (void)doSomethingWithCppClass;
@end

//  CppWrapper.mm
#import "CppWrapper.h"
#import "CppClass.h"
@implementation CppWrapper
- (id)init {
    self = [super init];
    if (self) {
        myCppClass = new CppClass;
    }    
    return self;
}
- (void)dealloc {
    delete myCppClass;
    [super dealloc];
}
- (void)doSomethingWithCppClass {
   static_cast<CppClass *>(myCppClass)->DoSomething();
}
@end

就个人而言,我会

#include "CppClass.h"

而不是导入它。

不过,这可能不是你的问题。