如何在iPhone / iPad Objective C项目中#import C ++头文件

时间:2013-01-31 09:36:32

标签: c++ iphone objective-c xcode objective-c++

推荐问题:Problem when #import C++ Header File in iPhone/iPad Project

好吧,我的项目相对庞大,无法解决将 ALL或PART OF 我的项目文件.m更改为.mm或更改 ALL或PART OF {/ 1}}中的文件类型。

这是因为我的同事和图书馆作者不会严格遵守C ++标准,例如将File Inspector分配给void*以及其他各种违规行为。目标C允许这些并且只是发出警告。

我想int*的C ++头文件是一个库。它在标头中使用关键字命名空间,而其实现位于#import程序集文件中。这意味着几乎不可能破解它们。除此之外,我的项目还包括仅与Objective C兼容的其他库。

有谁知道如何解决这个问题?

我能想象的方式如下:

  1. 找到命名空间的替代方案,但我仍然想写 我项目中的.a代码。

  2. 告诉编译器识别C ++标头(嗯,可能不是 可能的)

  3. 修改

    QCAR::Renderer

    如果我使用它,#ifdef __cplusplus # include MyCPPHeader.h #endif 真的会被包含在Objective-C环境中吗?我猜不会。这违反了不破解图书馆的原则。

    修改

    即使我更改了这些MyCPPHeader.h文件以包含该C ++标头,我也会收到链接错误.mm。当我的 Undefined symbols for architecture armv7:文件包含其他库中的.mm标题时,会发生这种情况。

1 个答案:

答案 0 :(得分:0)

一年前我已经解决了这个问题,但对于其他正在寻找答案的人来说,这就是解决方案。

假设C ++样式标题名为cpp.h。在我的项目中,我从不#import "cpp.h"。我写了一个名为c.h的C样式头,作为cpp.h的包装头。然后我编写了一个名为c.mm的C ++实现源文件,通过调用c.h中的函数来实现cpp.h中的函数define。如果我想调用cpp.h中的函数,我#import c.h并使用包装函数。

以下是可能更清晰的解释:

cpp.h使用namespace的C ++样式头文件,其实现是在汇编代码中,所以很难改变

c.h C样式标题作为cpp.h

的包装

c.mm C ++实现通过调用c.h

中的函数来实现cpp.h中的函数

#import "c.h"使用包装函数