gpt4 book ai didi

iphone - 为 C++ 库制作 Objective-C 包装器

转载 作者:可可西里 更新时间:2023-11-01 17:39:46 25 4
gpt4 key购买 nike

我正尝试在 Objective-C 中制作一个包装器,这样我就不必在库类之外编写 C++。

库主文件是 LLAHProcessor.h .cpp

我的包装器是 LLAHProcessorWrapper.h .mm

它编译得很好,但是当我将 LLAHProcessorWrapper 添加到其他类(假设是 UIView)作为成员变量时,我得到了数百个错误,例如:

#include <map> : Map no such a file or directory

在每个 C++ 类/结构中:

Expected specifier-qualifier list before ClassName

就像编译器不识别 C++ 代码一样。

我想知道我在这里错过了什么。它是否必须与我将其添加到 Xcode Target Properties: 的事实有关?

Other Link Flags : -lstdc++ -lz

或者我可能需要在此处添加新标志?

提前致谢

最佳答案

您的问题是 .m 文件被编译为 C 而不是 C++。因此,当编译器在编译 .m 文件时遇到任何 C++,即使是在头文件中,它也会 barf。

毫无疑问,您必须在头文件中放入一些 C++,因为您的 Objective C 对象包装了一个 C++ 对象,但有一些方法可以解决这个问题。一种方法是使用指向 C++ 对象的指针,并使用方便的预处理器定义 __cplusplus,它是为 C++(和 Objective-C++)定义的,而不是为 C(或 Objective-C)定义的,例如

// LLAHProcessorWrapper.h

#if defined __cplusplus
class MyCPPClass; // forward class declaration
#else
typedef struct MyCPPClass MyCPPClass; // forward struct declaration
#endif

@interface MyOCClass : NSObject
{
@private
MyCPPClass* cppObject;
}

// methods and properties

@end

因为您从不在 .mm 文件之外取消引用 cppObject 的成员,所以您从不提供结构的完整定义并不重要。

您将分别在-init-deallocnewdelete 指针。您可以在 LLAHProcessorWrapper.mm 中包含完整的 C++ 类声明。

关于iphone - 为 C++ 库制作 Objective-C 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4204239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com