永远不会创建ObjC文件但总是创建ObjC ++文件的任何缺点?

时间:2012-01-25 16:04:46

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

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

此时,ObjC编译器完全混淆并抛出大量解析错误,并且用户(也就是说:我)变得更加困惑直到它碰到我:当然我应该制作该文件而是一个ObjC ++文件。

选项包括:

  1. 告诉Xcode这个特定文件,即使它是.m文件 真的是一个ObjC ++文件,或
  2. 将该文件重命名为.mm。
  3. 第一个选项对我来说不太合适,因为该文件确实 ObjC ++,无论项目认为它是什么。

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

    所以我从现在开始决定将Xcode为我创建的任何.m文件重命名为.mm创建后的第一件事,这样我就不会忘记历史了。

    到目前为止,它对我来说效果很好,但我脑子里有一点担心,可能会出现一些我想要的ObjC文件,而不是ObjC ++文件。

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

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

5 个答案:

答案 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文件模板的更多详细信息,请参阅以下文章:

Creating Custom Xcode 4 File Templates

答案 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上,它并不重要。