【问题标题】:Any downside to never creating ObjC files but always creating ObjC++ files instead?从不创建 ObjC 文件但总是创建 ObjC++ 文件有什么缺点吗?
【发布时间】:2012-01-25 16:04:45
【问题描述】:

默认情况下,当您请求新的 ObjC 类时,Xcode 会同时创建一个 .h 和一个 .m 文件。 一切正常,直到您需要引用项目中其他地方的任何 C++ 文件并开始 #import 将其放入您的 .h 或 .m 文件中

此时,ObjC 编译器完全混乱并抛出大量解析错误,而您用户(即我)会更加困惑,直到它击中我:当然我应该制作那个文件一个 ObjC++ 文件。

选项有:

  1. 告诉 Xcode 这个特定的文件,即使它是一个 .m 文件 确实是一个 ObjC++ 文件,或者
  2. 将该文件重命名为 .mm。

第一个选项对我来说不是很可口,因为无论项目认为它是什么,该文件确实 ObjC++。

第二个选项也不好,因为它搞砸了 Git 存储库,然后“忘记”曾经有另一个 .m 文件,它确实是这个“新”.mm 文件的历史。

所以我决定从现在开始总是将 Xcode 为我创建的任何 .m 文件在创建后首先重命名为 .mm,这样我就不会丢失历史记录。

到目前为止,它对我来说效果很好,但我有点担心,在某些极端情况下,我可能真的想要一个 ObjC 文件而不是 ObjC++ 文件。

那些极端情况会是什么?任何人都知道任何碰巧不包含任何 C++ 引用但会以某种方式阻塞 ObjC 编译器的 ObjC++ 文件,仅仅是因为它是一个 .mm 文件?

如果没有缺点,为什么不永远弃用 .m 并坚持使用 .mm 呢?

【问题讨论】:

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


    【解决方案1】:

    解析 C++ 比解析 ObjC 慢得多,因此 ObjC++ 文件的编译时间要长得多。我不确定这种开销是否适用于不包含 C++ 的 ObjC++ 文件,但它在一定程度上会因为编译器需要查找 C++ 构造而更难解析。

    此外,C++ 类型系统有一些与 C 稍有不同的规则,这些规则也适用于 C++ 文件中的 ObjC/C 代码。我不记得细节,但这不会有害;只是可能需要一些额外的演员表。

    【讨论】:

      【解决方案2】:

      没有缺点,虽然有两个方法代表您创建(.cxx_construct.cxx_destruct),但它们仅用于在您创建/释放实例时制作和销毁 C++ 对象。如果你的类没有 C++ 成员,这些函数什么都不做,只会增加非常低的开销。否则,您仍然会为您的 Objective-C 方法生成 C 函数,而不是 C++ 函数。

      【讨论】:

        【解决方案3】:

        创建一个 Objective-C++ 文件模板,以便在创建新文件时获得 .mm 文件而不是 .m 文件。复制 Apple 的 Objective-C 类模板并将 .m 文件重命名为 .mm。以下文章提供了有关创建 Xcode 4 文件模板的更多详细信息:

        Creating Custom Xcode 4 File Templates

        【讨论】:

        • 这是一个很好的建议。有什么提示可以避免我的新 .mm 模板在下一次 Xcode 更新时被覆盖/销毁?
        • 将模板放在我链接到的文章中提到的用户模板文件夹中,应该足以防止您的模板在未来的 Xcode 更新中被覆盖。
        • 天哪!只是忽略了那一点。非常感谢!
        【解决方案4】:

        除了语言不兼容之外,避免完全使用 .mm 项目的一个原因是,您最终可能会很想用 c++ 开始您的方法部分,这将导致项目以(相对晦涩的)两种语言的混合体编写,并且只有知道两者的人才能理解。 (我以前做过)

        避免将 obj-c 标头与 c++ 混淆的一个好方法是在实现文件中声明实例变量(从 xcode 4.2/clang 3.0 开始允许,可能更早)。例如:

        @implementation MyClass {
            std::vector<int> myVector;
        }
        

        这有助于将 Objective-c 和 c++ 之间的联系点降至最低。

        【讨论】:

          【解决方案5】:

          我将 .mm 文件专门用于我的 iOS 代码,并且从未遇到任何问题。是的,我的编译速度要慢一些,因为干净的编译需要 15 秒而不是 10 秒。至少在 iMac 上,这并不重要。

          【讨论】:

            猜你喜欢
            • 2021-12-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-28
            • 1970-01-01
            • 2011-01-09
            • 2015-04-19
            相关资源
            最近更新 更多