默认情况下,当您要求新的ObjC类时,Xcode会同时创建.h和.m文件。 一切正常,直到您需要在项目的其他地方引用任何C ++文件并开始#import将其转换为.h或.m文件
此时,ObjC编译器完全混淆并抛出大量解析错误,并且用户(也就是说:我)变得更加困惑直到它碰到我:当然我应该制作该文件而是一个ObjC ++文件。
选项包括:
第一个选项对我来说不太合适,因为该文件确实是 ObjC ++,无论项目认为它是什么。
第二个选项也不好,因为它搞砸了Git repo,然后“忘记”曾经是另一个.m文件,这确实是这个'新'.mm文件的历史。
所以我从现在开始决定将Xcode为我创建的任何.m文件重命名为.mm创建后的第一件事,这样我就不会忘记历史了。
到目前为止,它对我来说效果很好,但我脑子里有一点担心,可能会出现一些我想要的ObjC文件,而不是ObjC ++文件。
那些角落案件会是什么?任何人都知道任何ObjC ++文件碰巧不包含任何C ++引用,但会以某种方式阻塞ObjC编译器,只是因为它是一个.mm文件?
如果没有缺点,为什么不直接弃用.m并坚持使用.mm呢?
答案 0 :(得分:3)
解析C ++比解析ObjC要慢得多,因此ObjC ++文件的编译时间要长得多。我不确定这个开销是否会适用于不包含C ++的ObjC ++文件,但是由于编译器需要查找C ++结构,因此它会更难解析它。
此外,C ++类型系统与C的规则略有不同,它们也适用于C ++文件中的ObjC / C代码。我不记得细节,但它不会有害;可能需要一些额外的演员表。
答案 1 :(得分:2)
没有缺点,虽然代表您创建了两个方法(.cxx_construct
和.cxx_destruct
),但它们仅用于在创建/解除实例时创建和销毁C ++对象。如果你的类没有C ++成员,那么这些函数什么都不做,只添加一个非常低的开销。否则,您仍然为Objective-C方法生成C函数,而不是C ++函数。
答案 2 :(得分:2)
创建Objective-C ++文件模板,以便在创建新文件时获得.mm文件而不是.m文件。制作Apple的Objective-C类模板的副本,并将.m文件重命名为.mm。有关创建Xcode 4文件模板的更多详细信息,请参阅以下文章:
答案 3 :(得分:1)
除了语言不兼容之外,避免完全.mm项目的一个原因是你最终可能会试图在c ++中启动方法的各个部分,这将导致一个项目用两种语言的(相对模糊的)混合编写,只有了解两者的人才能理解。 (我以前做过这个)
避免使用c ++混淆obj-c标头的一个好方法是在实现文件中声明实例变量(从xcode 4.2 / clang 3.0开始,可能更早)。例如:
@implementation MyClass {
std::vector<int> myVector;
}
这有助于使objective-c和c ++之间的联系点最小化。
答案 4 :(得分:1)
我专门为我的iOS代码使用.mm文件,从未遇到任何问题。是的,我的编译速度稍慢,因为干净的编译需要15秒而不是10秒。至少在iMac上,它并不重要。