8

Xcode で混合 C++/Objective-C コードをリファクタリングする方法はありますか?? Cocos2D と Box2D を使用してゲームを作成しています。Box2D は C++ で作成されているため、作成するすべてのクラスには .mm 拡張子が必要です。したがって、たとえば変数の名前を変更しようとすると、「Xcode は C のみをリファクタリングできます」のようなメッセージが表示されます。および Objective-C コード".

前もって感謝します!

4

4 に答える 4

10

Xcode は、単純な Obj-C であっても、リファクタリングが非常に制限されています。それは基本的に名前の変更であり、コメントで名前を変更することさえできません。それが何かをすることができないと言うなら、それはおそらくできないでしょう。

名前を変更する唯一の方法は、find & replace. Xcode は正規表現を処理できるので、多くの場合はそれで十分です。

もちろん、問題は find & replace がプログラミング言語を認識していないことであり、時には余分な置換を追加したり、何かを置換するのを忘れたりする可能性があるため、特に注意してください。リファクタリングのたびに、すべてが正しく名前変更されたことを確認するために、クリーン ビルドが必要です。

コマンド ライン ツール ( などsed) を使用して同じことを行うこともできます。

于 2013-04-05T17:19:56.893 に答える
3

私が構築している cocos2d/box2d ゲームでも同じ問題がありました。

事実 1: Xcode 4 は C および Objective-C (.m ファイル) コードをリファクタリングできますが、Objective-C++ コード (.mm ファイル) をリファクタリングすることはできません。

事実 2: box2d (c++ で記述) を操作する場合は、Objective-C++ を使用する必要があります。

次の手順に従って、(部分的に)問題に対処しました。

  1. 対話する必要がある box2d クラス用に Objective-C++ でいくつかのラッパーを作成しました (たとえば、 MyWorld.mmは c++ クラス b2World のラッパーであり、 MyBody.mm は c++ クラスb2Bodyラッパーです) 。ここでは、ラッパーの .h で box2d への参照を避けることが重要です。
  2. 私のプロジェクトの他のすべてのクラスでは、box2d クラスを直接参照したことはなく、代わりに関連するラッパーを参照しました。もちろん、これらのクラスから#import "Box2D.h"も削除しました。
  3. プロジェクトの他のすべてのクラスをプレーンな Objective-C (.m) に変換しました。

その結果、Xcode はプロジェクトのすべてのクラスをリファクタリングできるようになりましたが、もちろんラッパーもリファクタリングできます。

PS もちろん、Objective-C クラスでラッパー (MyWorld など) を使用する必要がある場合は、MyWorld.mmではなく MyWorld.h をインポートする必要があります。

于 2013-04-12T23:55:30.880 に答える
2

github でこのプロジェクトをチェックアウトすることをお勧めします - これは進行中の作業ですが、まだ:

https://github.com/lukhnos/refactorial

これは、Clang に基づく C++ リファクタリング ツールです (つまり、コンパイラ Xcode 自体が基づいています)。

于 2014-01-08T12:36:16.677 に答える
0

Objective-C と Objective-C++ のコードを分離するという、ある種の解決策がありました。ファイルが純粋な Objective-C で使用されているかどうかを検出できるマクロがいくつかあります。例:

http://philjordan.eu/article/strategies-for-using-c++-in-objective-c-projects

アイデアは、.mm ファイルをリファクタリングすることはできませんが、Objective-C++ コードが含まれている場合でも、他のすべてのコードをリファクタリングできるということです。

于 2015-04-22T08:21:08.543 に答える