我有一个 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(使用前将#替换为@)