7

Appleの最新のXcodeツールを使用して典型的なMacまたはiOSアプリケーションを開発していると仮定します。さらに、私が主にObjective-Cを使用してこのアプリケーションを開発し、AppleのCocoaまたはCocoaTouchフレームワークからの関連するすべてのAPIを活用していると仮定します。

現在、コードベースでC++またはObjective-C++を使用する予定はないとしますが、将来的には、ここに小さなObjective-C++を振りかけたいと思うかもしれません。

.mそのため、念のため、すべてのファイルに.mm代わりに名前を付けることを検討しています。(これにより、後でファイルの名前を変更する必要がなくなるため、SCMシステムの履歴がよりクリーンになるという望ましい効果が得られます。)

これは悪い考えですか?ファイルにObjective-C++が実際に含まれていない場合に.mm使用するよりも、ファイルの使用が明らかにまたは大幅に悪い理由はありますか?.m

おそらく、このファイル拡張子はコンパイラのスイッチを切り替え、ObjCだけでなくC++のソースコードも解析する必要があります。これは、中規模から大規模のコードベースのビルド時間に重大な悪影響を及ぼしますか?

他に覚えておくべきマイナス(またはプラス)の影響はありますか?

注:ObjCとC++のどちらが優れているかについてのコメントは返信しないでください。それはこの質問が何であるかではありません。

4

6 に答える 6

16

これは最悪のアイデアではありませんが、良いアイデアでもありません。

Objective-C++ の主な目的は、C++ ライブラリを使用する必要がある Objective-C コードのブリッジとして機能することです。したがって、ほとんどのプロジェクトでは、ほとんどすべてのコードが単純な古い Objective-C であり、C++ ライブラリと対話する「ラッパー」オブジェクトを作成するための .mm ファイルがいくつか含まれています。

したがって、コードの大部分を Objective-C から Objective-C++ に変更する必要がある可能性はほとんどありません。SCM 履歴に多くのファイル名を変更するべきではありません。

Objective-C++ をあらゆる場所で使用することの主な問題は、「あまり通らない道」をたどることになることです: 読んだチュートリアルと、使用して学習するオープンソース コードの 99% は、すべて Obj-C++ によってコンパイルされるように記述されます。 C コンパイラ。Obj-C++ コンパイラを使用してもほとんど同じであり、ほとんどの場合違いはありませんが、最終的に Obj-C++ のコンパイルがわずかに異なるため、何らかの問題が発生します。バグは明らかではなく、十分にテストされていないコンパイラ設定を使用しているためであることに気付く前に、診断に多くの時間を費やすことになります。

C++ の経験が豊富で、コード内で C++ の機能が「必要」であることに気付いた場合でも、実際には必要ない可能性が高く、Objective-C で同等の機能を実行する方法を理解するためにもう少し時間を費やす必要があります。 . ローマにいるときは、ローマ人がするようにしなさい。

一般に、「万が一に備えて」は、標準的な慣行から逸脱する正当な理由にはなりません。多くの場合、必要のないものに多大な労力を費やすことになります。

于 2012-08-12T17:59:38.860 に答える
4

コメントで書いたように、C++ は C の厳密なスーパーセットではないため、Objective-C++ ファイルに配置するとコンパイルされない C99 コードなどを使用する場合に遭遇する可能性があります。最近、C99複合リテラルを使用してこの問題が発生しました。

于 2012-08-13T02:38:48.150 に答える
4

バリー・ワークからの引用:

「通常の」Objective-C で .m よりも .mm を使用する主な欠点は、Objective-C++ のコンパイル時間が大幅に長くなることです。これは、C++ コンパイラが C コンパイラよりも時間がかかるためです。Xcode 3.2 以降では、Objective-C コードで Clang フロントエンド ツール チェーンを使用して、Objective-C/C のコンパイル時間を大幅に短縮できます。Clang はまだ Objective-C++/C++ をサポートしていないため、2 つの間のコンパイル時間のギャップがさらに広がります。

しかし

2012 年 2 月 17 日更新 Xcode 4.0 (LLVM 3.0 を使用) の時点で、Clang は Objective-C++ をサポートしています。C++11 のサポートでさえ、今では非常に強力です。

したがって、C 機能のみを使用する場合、.mm ファイルは .m と非常によく似たコードを生成する必要がある限り、.mm を使用しても問題ないと思います。

于 2012-08-12T17:48:47.727 に答える
3

はい、それは悪い考えです。

ファイルを見ると、.mm(もちろん Objective-C に加えて) C++ コードが含まれていると思います。OOP とは直接関係なく、C++ と C++ では少し異なる点がいくつかあります。

したがって、すべての Objective-C ファイルに.m. C++ 機能が必要になったらすぐに名前を変更し.mm、すべてが機能することを確認します。

ヘッダー ファイルを C++ レスのままにしておくと、ボーナス ポイントが得られます。

于 2012-08-12T19:39:58.027 に答える
0

私の経験から (Apple で): 1) xcode チームは最後に c++ について考えます (objc++ でブロックのサポートを取得するのに永遠にかかりました) 2) objc++ はコンパイルがはるかに遅いです

于 2012-08-12T19:31:06.920 に答える
0

.mm 拡張子は、Objective-C++ ファイルを意味します。コンパイラは、C コードよりも C++ コードのコンパイルに時間がかかります。

そのため、必要がない場合は、拡張子を .m のみにしてください。

于 2012-08-12T17:49:25.727 に答える