7

假设我正在使用 Apple 最新的 Xcode 工具开发典型的 Mac 或 iOS 应用程序。进一步假设我主要使用 Objective-C 开发此应用程序,并利用 Apple 的 Cocoa 或 Cocoa Touch 框架中的所有相关 API。

假设我目前没有任何计划在我的代码库中使用 C++ 或 Objective-C++,但我怀疑在未来的某个时间我可能想在这里或那里加入一点 Objective-C++。

所以我正在考虑将我所有的.m文件命名为.mm,以防万一。(这将在我的 SCM 系统中产生更清晰的历史记录,因为我以后不必重命名文件。)

这是一个坏主意吗?是否有任何理由为什么使用.mm文件肯定或明显比使用.m文件实际上不包含任何 Objective-C++ 时使用更糟糕?

大概这个文件扩展名会触发编译器中的一些开关,然后编译器不仅要解析 ObjC 的源代码,还要解析 C++ 的源代码。这对中型到大型代码库的构建时间是否有显着的负面影响?

我应该记住它是否有任何其他负面(或正面)影响?

注意:请不要回复任何关于 ObjC 或 C++ 是否更好的评论。这不是这个问题的目的。

4

6 回答 6

16

这不是最坏的主意,但也不是一个好主意。

Objective-C++ 的主要目的是充当需要使用 C++ 库的 Objective-C 代码的桥梁。因此,在大多数项目中,几乎所有代码都是普通的老式 Objective-C,可能有几个 .mm 文件来创建一个“包装器”对象来与 C++ 库对话。

因此,您极不可能需要将代码的重要部分从 Objective-C 更改为 Objective-C++。您的 SCM 历史记录中不应该有很多文件重命名。

到处使用 Objective-C++ 的主要问题是你将遵循“少有人走的路”:你阅读的 99% 的教程以及你使用和学习的开源代码都将被编写为由 Obj- 编译C 编译器。使用 Obj-C++ 编译器将大体相同,并且可能在大多数情况下不会产生任何影响,但您最终会遇到一些问题,这是由于 Obj-C++ 的编译方式略有不同,但是当您发现错误它不会很明显,并且您将花费大量时间尝试诊断它,然后才意识到这是因为您使用的编译器设置测试得不太好。

如果你有很多 C++ 经验,并且发现自己在代码中“需要”来自 C++ 的特性,那么你可能并不真正需要它们,你可能需要花更多的时间来弄清楚如何在 Objective-C 中做同样的事情. 在罗马做到入乡随俗。

一般来说,“以防万一”并不是偏离标准做法的好理由。你经常会在不需要的东西上花费很多精力。

于 2012-08-12T17:59:38.860 回答
4

引用巴里·沃克的话:

对于“普通”Objective-C,使用 .mm 而不是 .m 的主要缺点是 Objective-C++ 的编译时间要长得多。这是因为 C++ 编译器比 C 编译器需要更长的时间。在 Xcode 3.2 及更高版本中,Objective-C 代码可以使用 Clang 前端工具链来显着加快 Objective-C/C 编译时间。由于 Clang 还不支持 Objective-C++/C++,这进一步拉大了两者在编译时间上的差距。

更新 2012 年 2 月 17 日 从 Xcode 4.0(使用 LLVM 3.0)开始,Clang 已支持 Objective-C++。即使是 C++11 支持现在也相当强大。

所以我认为只要你只使用C特性就可以使用.mm,.mm文件应该生成与.m非常相似的代码

于 2012-08-12T17:48:47.727 回答
4

正如我在评论中所写,C++ 不是 C 的严格超集,因此您可能会遇到使用例如 C99 代码的情况,如果您将其放在 Objective-C++ 文件中将无法编译。我最近在使用 C99复合文字时遇到了这个问题。

于 2012-08-13T02:38:48.150 回答
3

是的,这是个坏主意。

当我看到一个.mm文件时,我希望它有 C++ 代码(当然还有 Objective-C)。与 C++ 相比,有一些与 OOP 没有直接关系的东西在 C++ 中有些不同。

因此,将所有 Objective-C 文件命名为.m. 只要您需要任何 C++ 功能 - 将其重命名为.mm并验证一切正常。

如果您保留头文件 C++-less,您将获得奖励积分。

于 2012-08-12T19:39:58.027 回答
0

.mm 扩展名表示 Objective-C++ 文件。编译器编译 c++ 代码比 C 代码花费更多时间。

因此,如果不需要,请将扩展名仅保留为 .m。

于 2012-08-12T17:49:25.727 回答
0

根据我的经验(在 Apple):1)xcode 团队最后考虑 c++(花了很长时间才获得 objc++ 中的块支持)2)objc++ 编译速度要慢得多

于 2012-08-12T19:31:06.920 回答