2012-01-25 13 views
4

デフォルトでは、新しいObjCクラスを要求すると、Xcodeは.hと.mファイルの両方を作成します。 プロジェクトのどこかのC++ファイルを参照して、そのファイルを.hまたは.mファイルにインポートするまでは、すべてうまく動作します。ObjCファイルを作成することはありませんが、常にObjC++ファイルを作成することには欠点がありますか?

その時点で、ObjCコンパイラは完全に混乱し、エラーを解析して、あなたのユーザー(つまり:me)が私に当たるまではさらに混乱します。もちろん、そのファイルをObjC++ファイルにする必要があります。

オプションは次のとおりです。

  1. のtellそれは.mファイル であっても、この特定のファイルは、実際にObjC++ファイルであるXcodeの、または
  2. は、そのファイルが.mmして名前を変更します。そのファイルは本当ににかかわらず、プロジェクトはそれが何を考えてのにObjC++であるため、

最初のオプションは、私にとって非常においしいではありません。

2番目のオプションは、Gitリポジトリを壊してしまい、実際にはこの新しい「.mm」ファイルの履歴である別の.mファイルが存在することを「忘れている」という理由で良くありません。

Xcodeが私のために作成する.mファイルの名前を変更するには、まず最初に.mmファイルを作成してから履歴を失わないようにしてください。

これまでのところうまくいきましたが、ObjC++ファイルではなく、ObjCファイルが本当に必要なコーナーケースがあるかもしれません。

これらのコーナーケースは何ですか?誰もがC++リファレンスを含んでいないObjC++ファイルを認識していますが、.mmファイルであることによってObjCコンパイラを何らかの形で詰まらせるでしょうか?

また、欠点がない場合は、いつも.mの使用を非難し、永遠に.mmに固執するのはなぜですか?

答えて

2

あなたの代わりに2つのメソッド(.cxx_constructおよび.cxx_destruct)が作成されていますが、インスタンスを作成または削除するときにC++オブジェクトを作成および破棄するためにのみ使用されます。クラスにC++メンバーがない場合、これらの関数は何もせず、非常に低いオーバーヘッドしか追加しません。それ以外の場合は、C++関数ではなくObjective-Cメソッドに対してC関数が生成されます。

3

解析C++はObjCの解析よりもはるかに遅いため、ObjC++ファイルのコンパイル時間は大幅に長くなります。このオーバーヘッドがC++を含んでいないObjC++ファイルにも当てはまるのかどうかはわかりませんが、コンパイラがC++の構造を探す必要があるため解析するのが難しいという意味合いがあります。

また、C++タイプのシステムには、C++ファイルのObjC/Cコードにも適用される、Cとは少し異なる規則があります。私は詳細を思い出さないが、それは有害ではない。ちょっと余分なキャストが必要かもしれません。

2

新しいファイルを作成するときに.mファイルの代わりに.mmファイルが得られるようにObjective-C++ファイルテンプレートを作成します。 AppleのObjective-Cクラステンプレートのコピーを作成し、.mファイルの名前を.mmに変更します。Xcodeの4ファイルテンプレートの作成に関するより詳細な情報は、次の資料に提供されています:

Creating Custom Xcode 4 File Templates

+0

それは素晴らしいアドバイスでした。新しい.mmテンプレートが次のXcodeアップデートで上書き/破棄されるのを避けるためのヒント? – verec

+0

リンク先の記事に記載されている場所にあるユーザーテンプレートフォルダーにテンプレートを配置すると、将来のXcode更新でテンプレートが上書きされないようにすることができます。 –

+0

ああ、私!ちょっと見落としました。どうもありがとうございます! – verec

1

言語の非互換性はさておき、完全.mmプロジェクトを回避するための一つの理由は、あなたがのセクションを開始するように誘惑されてしまうかもしれないということですC++でのあなたのメソッドは、2つの言語の(比較的不明瞭な)ハイブリッドで書かれたプロジェクトになり、両方を知っている人だけが理解するでしょう。

C++でobj-cヘッダーが乱雑にならないようにする良い方法は、実装ファイル(xcode 4.2/clang 3.0以降で許可されている)でインスタンス変数を宣言することです。例:

これは、objective-cとC++の接点を最小限に抑えるのに役立ちます。

1

iOSコード専用の.mmファイルを使用していますが、問題は一度もありませんでした。はい、私のコンパイルは、クリーンなコンパイルが15秒か10秒かかりますという点で少し遅いです。少なくともiMacでは重要ではない。

関連する問題