Xcode で混合 C++/Objective-C コードをリファクタリングする方法はありますか?? Cocos2D と Box2D を使用してゲームを作成しています。Box2D は C++ で作成されているため、作成するすべてのクラスには .mm 拡張子が必要です。したがって、たとえば変数の名前を変更しようとすると、「Xcode は C のみをリファクタリングできます」のようなメッセージが表示されます。および Objective-C コード".
前もって感謝します!
Xcode で混合 C++/Objective-C コードをリファクタリングする方法はありますか?? Cocos2D と Box2D を使用してゲームを作成しています。Box2D は C++ で作成されているため、作成するすべてのクラスには .mm 拡張子が必要です。したがって、たとえば変数の名前を変更しようとすると、「Xcode は C のみをリファクタリングできます」のようなメッセージが表示されます。および Objective-C コード".
前もって感謝します!
Xcode は、単純な Obj-C であっても、リファクタリングが非常に制限されています。それは基本的に名前の変更であり、コメントで名前を変更することさえできません。それが何かをすることができないと言うなら、それはおそらくできないでしょう。
名前を変更する唯一の方法は、find & replace
. Xcode は正規表現を処理できるので、多くの場合はそれで十分です。
もちろん、問題は find & replace がプログラミング言語を認識していないことであり、時には余分な置換を追加したり、何かを置換するのを忘れたりする可能性があるため、特に注意してください。リファクタリングのたびに、すべてが正しく名前変更されたことを確認するために、クリーン ビルドが必要です。
コマンド ライン ツール ( などsed
) を使用して同じことを行うこともできます。
私が構築している cocos2d/box2d ゲームでも同じ問題がありました。
事実 1: Xcode 4 は C および Objective-C (.m ファイル) コードをリファクタリングできますが、Objective-C++ コード (.mm ファイル) をリファクタリングすることはできません。
事実 2: box2d (c++ で記述) を操作する場合は、Objective-C++ を使用する必要があります。
次の手順に従って、(部分的に)問題に対処しました。
その結果、Xcode はプロジェクトのすべてのクラスをリファクタリングできるようになりましたが、もちろんラッパーもリファクタリングできます。
PS もちろん、Objective-C クラスでラッパー (MyWorld など) を使用する必要がある場合は、MyWorld.mmではなく MyWorld.h をインポートする必要があります。
github でこのプロジェクトをチェックアウトすることをお勧めします - これは進行中の作業ですが、まだ:
https://github.com/lukhnos/refactorial
これは、Clang に基づく C++ リファクタリング ツールです (つまり、コンパイラ Xcode 自体が基づいています)。
Objective-C と Objective-C++ のコードを分離するという、ある種の解決策がありました。ファイルが純粋な Objective-C で使用されているかどうかを検出できるマクロがいくつかあります。例:
http://philjordan.eu/article/strategies-for-using-c++-in-objective-c-projects
アイデアは、.mm ファイルをリファクタリングすることはできませんが、Objective-C++ コードが含まれている場合でも、他のすべてのコードをリファクタリングできるということです。