混合使用C++和Objective C

5

我在使用C++和Objective-C时,想找到一份具体的文档或者是一个关于使用dos和donts的指南文档,你知道哪里可以找到吗?

苹果公司似乎已经从他们的网站上删除了这个文档,我正在从博客和这里发布的问题中收集信息,但还是感到困惑。

请问有人可以提供相关指导吗?

在混合语法或使用属于C ++类的对象的.m文件时,我们何时使用.mm文件?

当将对象传递给属于两种不同语言的函数之间时,例如将objective-c对象传递给cpp文件中的函数时,是否需要将其收集到void *中,还是可以使用(ObjectiveC interface)*?


“while using an object in .m file which belongs to a C++ class” 是什么意思? - pmdj
@pmjordan:如果我在Objective-C接口中组合C++对象。#import "cplusplus.h" @interface xyz : NSObject { Cplusplus * myobj; } @end - tusharfloyd
2个回答

6
您需要在同时编写Objective-C和C++代码的同一文件中使用Objective-C++。当您使用#include/#import或直接编写这两种语言的代码时,需要使用Objective-C++。明确的代码通常很明显;#include通常不太明显,您需要注意避免将其中一种语言泄漏到另一种语言中。您示例中#importC++头文件是清晰明了的:只有使用Objective-C++才能这样做。请注意,如果您的Cplusplus是一个struct类型,则可以将其前向声明为该类型,而不是#import C++头文件。
如果您在头文件中这样做,它将“污染”头文件,只能在该模式下工作。您需要积极避免此问题,否则您的整个项目很快就会只有.mm文件。我在本文档中记录了一些技术,以及之前,在这篇早期文章中。对于较新版本的Objective-C,您还可以在类别扩展中向类添加ivars。这意味着您可以在.mm文件中定义C++类型的ivars,而不是在头文件中,从而允许.m文件进行#import
对于您的第二个问题(请一次只提一个问题): id 类型在 objc.h 头文件中用 C 语言定义,因此可以在 Objective-C 和 C++ 中使用。同样,Objective-C 运行时 API 是以 C 函数的形式公开的,这些函数也可以在 C++ 中使用。如果您实际上想要从 C++ 代码中使用规范语法发送消息并访问 Objective-C 对象的属性,则需要将该文件切换为 Objective-C++。

如果我使用@class(前向声明)而不是#import,那么 - tusharfloyd
@class 前向声明一个 Objective-C 类(在纯 C++ 中是非法的)。class 前向声明一个 C++ 类,但在 Objective-C 中没有特殊含义(你可以在技术上将变量命名为 "class")。在 C++ 中,结构体和类几乎完全相同,在 Objective-C 中从 C 继承了结构体。因此,如果您将 C++ 类定义为 struct,则可以在 Objective-C 头文件中前向声明它。 - pmdj
Phil自发布这篇文章以来已经更新了它,新的文章在这里:http://philjordan.eu/article/mixing-objective-c-c++-and-objective-c++。 - Greg M. Krsak

3

当您的代码中包含C++语法或包含包含C++代码的文件时,请使用.mm文件。

将C++与Objective-C混合可能有点令人困惑,但如果您从指针的角度考虑,这并不是什么大问题。将C++对象实例方法视为C++中的方法,并对待Objective-C对象同样如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接