Рефакторинг Xcode C ++ и Objective-C

Есть ли способ рефакторинг смешанный код C ++ / Objective-C в Xcode ?? Я пишу игру, используя Cocos2D и Box2D, а Box2D написан на C ++, поэтому каждый класс, который я пишу, должен иметь расширение .mm и, следовательно, когда я пытаюсь, например, переименуйте переменную, я получил сообщение типа «Xcode может выполнять рефакторинг только кода C и Objective-C».

Заранее спасибо!

8

Решение

Xcode ОЧЕНЬ ограничен рефакторингом, даже с простым Obj-C. Это в основном переименование, и он даже не может переименовывать в комментариях. Если он говорит, что не может что-то сделать, то, вероятно, не может.

Единственный способ переименовать это использовать find & replace, Обратите внимание, что Xcode может обрабатывать регулярные выражения, поэтому он часто достаточно хорош.

Конечно, проблема в том, что найти & Замена не знает языка программирования и иногда может добавить дополнительную замену или забыть заменить что-либо, поэтому будьте особенно осторожны. Чистая сборка необходима после каждого рефакторинга, чтобы проверить, что все правильно переименовано.

Вы также можете использовать инструменты командной строки (например, sed) добиться того же.

10

Другие решения

У меня была такая же проблема в игре cocos2d / box2d, которую я строю.

Факт 1: Xcode 4 может реорганизовать код C и Objective-C (файлы .m), но не может реорганизовать код Objective C ++ (файлы .mm).

Факт 2: Если вы хотите взаимодействовать с box2d (который написан на c ++), вам нужно использовать Objective-C ++.

Я (частично) решил проблему, выполнив следующие действия:

  1. Я создал несколько оболочек в Objective-C ++ для классов box2d, с которыми мне нужно было взаимодействовать (например, MyWorld.mm это обёртка класса c ++ b2World а также MyBody.mm это обертка для класса C ++ b2Body). Здесь важно избегать любых ссылок на box2d в .h упаковщиков.
  2. В любом другом классе моего проекта я никогда не ссылался непосредственно на классы box2d, я ссылался вместо этого на связанные обертки. Конечно я тоже убрал #import «Box2D.h» из этих классов.
  3. Я преобразовал в обычный Objective-C (.m) все остальные классы моего проекта.

Результатом является то, что теперь XCode может рефакторинг любого класса моего проекта, но обертки, конечно.

Постскриптум Конечно, когда вам нужно использовать оболочку (например, MyWorld) в ваших классах Objective-C, вы должны импортировать MyWorld.h и не MyWorld.mm.

3

Возможно, вы захотите проверить этот проект на github — он находится в стадии разработки, но все же:

https://github.com/lukhnos/refactorial

Это инструмент рефакторинга на С ++, основанный на Clang (то есть на основе самого Xcode компилятора).

2

У меня было какое-то решение — разделить код Objective-C и Objective-C ++. Есть несколько макросов, которые позволяют определить, используется ли файл в чистом Objective-C. Пример:

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

Идея в том, что вы все еще не можете реорганизовать файлы .mm, но вы можете реорганизовать весь другой код, даже если он включает код Objective-C ++.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector