【问题标题】:Include mm file in m file在 m 文件中包含 mm 文件
【发布时间】:2014-07-27 20:51:27
【问题描述】:

我有一个带有 c++ 代码和类声明的 .mm 文件。我想将它包含在另一个 .m 文件中,但编译器开始在另一个类中给出错误 未知类型名称“类”;你是说“类”吗?

请注意,.m 文件已包含在 .mm 文件中。

例如

啊.h

A.mm -> 这个类有#include "B.h"

B.h -> #include "A.h" 当我尝试导入 A.h 时会出错。

B.m -> #include "A.h" 当我尝试导入 A.h 时会出错。

我尝试在 .m 文件中使用 struct,但实例中没有调用该方法。

任何帮助将不胜感激。

【问题讨论】:

  • 在另一个文件中包含 .m 或 .mm 文件很少有好处。与在常规 C 中包含 .c 相同——这是在非常特殊的情况下完成的,但如果你试图在“正常”情况下这样做,那么你做错了什么。这就是为什么有 .h 文件的原因。 (如果你不知道这一点,你就不应该在 Objective-C 中编程——首先学习普通的旧 C。)
  • ...Objective-C 根本不懂 C++,所以不仅是一种不寻常的技术,而且是浪费时间。
  • 如果包含 c++,您的 .m 将无法包含 .mm 的标头。您将需要制作一个仅包含 objc 的标头以包含,并将 c++ 部分保留在 .mm 或另一个 .h 中。
  • 如果没有向我们展示代码和错误,请不要告诉我们您收到错误。
  • 如果您有一个包含仅 C++ 项目的 .h 文件,当它包含在非 C++ 模块中时,您需要使用 #ifdef 跳过这些项目。您可以测试 C++ 的标准 #define。

标签: c++ objective-c objective-c++


【解决方案1】:

你真正想做什么?尝试在源文件中包含源文件是一件非常罕见的事情,而且通常会让人感觉到程序架构中存在其他问题。

通常,您应该为 .m 和 .mm 文件分别提供一个头文件和一个实现文件。如果您不希望 ObjC 类声明位于主标头中(例如,因为您正在实现一个框架并且此标头是框架的公共 API),您也可以有多个标头。例如。你可以有一个 MyClass.h 和一个 MyClassPrivate.h,并且只包含第二个。

您不能真正从普通的 ObjC 使用 C++(这就是 ObjC++ 的用途),因此无法在 ObjC 文件中使用 .mm 的标头。除非您将其拆分为 ObjC 部分(您可以使用)和 C++ 部分,例如在几个标题中。

有关混合直接 ObjC 和 ObjC++ 的更多信息,请查看我在此线程中的答案:Can I separate C++ main function and classes from Objective-C and/or C routines at compile and link?

我还做了一个播客节目,其中我更详细地介绍了一起使用 C++ 和 ObjC 的变幻莫测:http://nsbrief.com/113-uli-kusterer/ 特别是,请确保您 100% 确定编译单元是什么,否则您将总是遇到问题,包括来自 C++ 的 ObjC 标头或来自 ObjC 的 (Obj)C++ 标头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多