如何在 Objective-C 中包装 C++ 库?

2024-04-07

我有一个 C++ 库(仅限 .h),其中包含数据结构的实现,我想在我的 iPhone 应用程序中使用它。

首先,我用 Objective-C++ 编写了一个包装器作为一个类,通过组合,它具有 C++ 类的 ivar。然后我“有义务”将包装类扩展更改为.mm,看起来不错。但随后我必须将这个包装的类文件包含到其他几个文件中,因此我也必须更改它们的扩展名(以防止出现一波编译时错误)。

我对么?有没有办法将 .mm 扩展名“限制”到几个文件?(从而防止名称冲突等)

编辑:一些可能有帮助的信息,我使用 LLVM 1.5 作为编译器(我注意到编译时错误的数量从 GCC 4.2 到 LLVM 1.5 有所不同,但我不确定这意味着什么,因为我没有'不看它们全部)


我的建议是将 C++ 位包装在 #ifdefs 中:

//MyWrapper.h

#ifdef __cplusplus
class ComposedClass;
#endif 

@interface MyWrapper : NSObject
{
#ifdef __cplusplus
ComposedClass *ptr;
#endif
}

// wrapped methods here...
@end

这是 PIMPL 习惯用法的一个稍微蹩脚的版本,但代码较少,并且可以有效地从纯 Objective-C 代码中隐藏 C++ 主义。显然你必须包括ComposedClass的标题在你的MyWrapper.mm.

If ComposedClass是模板类型,您需要将第一个块修改为

#ifdef __cplusplus
#include "ComposedClass.h"
#endif

当然,不要使用前向声明,然后在 Objective-C 类的实例变量声明中使用模板化类型。

这种方法是建议 http://www.cocoabuilder.com/archive/cocoa/286695-synthesized-ivar-for-std-tr1-shared-ptr-myclass.html#286834作者:Greg Parker,Apple 的运行时专家。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Objective-C 中包装 C++ 库? 的相关文章

  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 如何减少典型 iPhone 应用程序的启动时间?

    需要明确的是 这是一个普通的 iPhone 应用程序 而不是游戏 我在网上读过几次 一些开发人员提到他们正在努力改进 减少应用程序的启动时间 但从来没有提供任何关于如何做到这一点的良好背景信息 那么问题很简单 如何减少 iPhone 应用程
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 是什么导致了这个 iPhone 崩溃日志?

    我有点卡住了 需要解决这个问题 因为我的一个应用程序出现了随机崩溃 而这些崩溃并不总是能够重现 这是崩溃日志之一 Incident Identifier 59865612 9F00 44EA 9474 2BF607AD662E CrashR
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke

随机推荐

  • RecyclerView 正在切断最后一项

    我有一个带有工具栏和里面有 recyclerView 的片段 我正在用虚拟数据填充 recyclerView 然后尝试显示它们 由于某种原因 recyclerView 的最后一个元素被截断 这是该片段的 XML
  • Python 中的鲍勃计数器

    使用 Python 2 7 我试图计算短语 bobbbobobboobobookobobbobbboj 中 bob 出现的次数 为此 我编写了以下代码 b 0 string bobbbobobboobobookobobbobbboj str
  • 解构对象作为函数参数

    不太明白这个参数const Posts以下 我对 Node React 还很陌生 它是解构的参数对象吗 或者它只是作为参数传递的对象 getPosts 和 post 显示为未定义 但我不明白参数对象是从哪里传递到函数中的 完整代码在这里 h
  • Visual Studio 2010:向 2008 生成的 wsdl 添加服务引用

    不生成 app config 在我的团队中有一个人拥有 Visual Studio 2008 他创建了一个 Web 服务 然后我将这个 Web 服务添加到控制台项目中 添加服务引用没有问题 但不会生成有效的 app config 只不过是空
  • 在 R 中对非常小的值使用舍入函数返回零

    有时我必须处理非常低的 p 值并以表格格式呈现它们 R 返回的值可以具有很长的有效数字 即小数点后的数字 现在 由于 p 值无论如何都很低 我倾向于在将它们写入 xls 或 tsv 文件之前缩短它们 只是为了使表格看起来漂亮 我在用R ve
  • docker python 自定义模块未找到

    我是 docker 新手 正在尝试将一个简单的应用程序移至 docker 我可以使用 pip install 导入Python标准模块 但是 我有一些想要使用的自定义 python 实用程序文件 这些文件位于单独的包 utils 中 在我的
  • 无限循环使 TimeManager 失效

    我在 WPF 应用程序中遇到了一个非常棘手的缺陷 需要追踪 错误信息是 无限循环似乎是由重复导致的 在布局 渲染过程中使 TimeManager 无效 堆栈跟踪 就其价值而言 是 在 System Windows Media MediaCo
  • TortoiseSVN无法验证

    在我之前的问题之后 TortoiseSVN无法连接 https stackoverflow com questions 11820835 tortoisesvn cant connect解决了 我又遇到了新的问题 在托管我的 svn 存储库
  • 当我尝试在 Windows PC 上安装 PySide2 时,为什么总是出现错误?

    我一直在尝试安装PySide2在我的电脑上 Windows 10 64bits with Python 3 8已安装 但每次都出现错误 我使用了命令pip install PySide2 它对我不起作用 任何帮助将不胜感激 Error ER
  • Linux 如何知道何时为调用堆栈分配更多页面?

    鉴于以下程序 segfault 顾名思义 将通过访问堆栈下方的 256k 来使程序出现段错误 nofault 然而 逐渐将堆栈推到下方 1m 但永远不会出现段错误 此外 运行segfault after nofault 也不会导致错误 如果
  • Sphinx 文档中使用全局变量标准化链接

    我正在使用 Sphinx 来记录工作项目 我想在整个文档的多个页面上使用指向下载的相同链接 例如 home rst Hi I want you to download my project download blah com downloa
  • Dagster 循环实体的输出和并发处理

    我有一个由两个固体组成的 Dagster 管道 下面是可重现的示例 首先 return some list 输出一些对象的列表 第二个固体 print num 接受第一个列表 不是完整列表 中的元素 并对该元素进行一些处理 我该如何为第一个
  • Rails 视图显示双花括号中的格式输入,例如 {{parameter}} 而不是实际值

    我在使用 Rails 2 3 8 执行以下功能时收到此错误 单词时间距离 shows 还剩 count 天 以及表格错误 Restful 身份验证登录显示无效表单的错误 如下所示 count 个错误禁止保存此 model 以下字段存在问题
  • 更快地循环图像的方法

    有谁知道如何更快地完成这项工作 我可以使用 Lockbits 做同样的事情吗 for int y 0 y lt picture Height y for int x 0 x lt picture Width x Color colorPix
  • 散点图中点的垂直线

    假设我有一组点x以及一组对应的数据y 我现在将这些绘制成散点图 plt scatter x y 我得到的图包含一些由 matplotlib 生成的 x 轴刻度 有没有一种方法可以实现自动勾选 但要添加从 x 轴到散点中的点的垂直线并标记它们
  • 在 Nuget 的构建后获取版本

    Code if ConfigurationName Release cd ProjectDir nuget spec Entities f nuget pack DeusPak Entities csproj Prop Configurat
  • Eclipse 图形布局不显示任何内容

    I am doing a mobile application on Eclipse and once I re installed my Android SDK after installation something odd happe
  • Twitter Bootstrap:使表单输入和按钮与 Chrome 和 Firefox 中的高度相同

    Using Twitter 引导程序 2 3 2 http twitter github io bootstrap base css html forms我有一个input append form
  • 操作栏溢出不显示

    我正在为 Sherlock 设置一个带有 3 个项目 图标的操作栏 在 ICS 模拟器上运行时 我只能看到 2 个图标 而且 没有溢出菜单 那三个点图标 如果我按手机的菜单按钮 我只会看到第三个图标 我是否必须强制使用溢出图标 如果是的话我
  • 如何在 Objective-C 中包装 C++ 库?

    我有一个 C 库 仅限 h 其中包含数据结构的实现 我想在我的 iPhone 应用程序中使用它 首先 我用 Objective C 编写了一个包装器作为一个类 通过组合 它具有 C 类的 ivar 然后我 有义务 将包装类扩展更改为 mm