Есть ли способ рефакторинг смешанный код C ++ / Objective-C в Xcode ?? Я пишу игру, используя Cocos2D и Box2D, а Box2D написан на C ++, поэтому каждый класс, который я пишу, должен иметь расширение .mm и, следовательно, когда я пытаюсь, например, переименуйте переменную, я получил сообщение типа «Xcode может выполнять рефакторинг только кода C и Objective-C».
Заранее спасибо!
Xcode ОЧЕНЬ ограничен рефакторингом, даже с простым Obj-C. Это в основном переименование, и он даже не может переименовывать в комментариях. Если он говорит, что не может что-то сделать, то, вероятно, не может.
Единственный способ переименовать это использовать find & replace
, Обратите внимание, что Xcode может обрабатывать регулярные выражения, поэтому он часто достаточно хорош.
Конечно, проблема в том, что найти & Замена не знает языка программирования и иногда может добавить дополнительную замену или забыть заменить что-либо, поэтому будьте особенно осторожны. Чистая сборка необходима после каждого рефакторинга, чтобы проверить, что все правильно переименовано.
Вы также можете использовать инструменты командной строки (например, sed
) добиться того же.
У меня была такая же проблема в игре cocos2d / box2d, которую я строю.
Факт 1: Xcode 4 может реорганизовать код C и Objective-C (файлы .m), но не может реорганизовать код Objective C ++ (файлы .mm).
Факт 2: Если вы хотите взаимодействовать с box2d (который написан на c ++), вам нужно использовать Objective-C ++.
Я (частично) решил проблему, выполнив следующие действия:
Результатом является то, что теперь XCode может рефакторинг любого класса моего проекта, но обертки, конечно.
Постскриптум Конечно, когда вам нужно использовать оболочку (например, MyWorld) в ваших классах Objective-C, вы должны импортировать MyWorld.h и не MyWorld.mm.
Возможно, вы захотите проверить этот проект на github — он находится в стадии разработки, но все же:
https://github.com/lukhnos/refactorial
Это инструмент рефакторинга на С ++, основанный на Clang (то есть на основе самого Xcode компилятора).
У меня было какое-то решение — разделить код Objective-C и Objective-C ++. Есть несколько макросов, которые позволяют определить, используется ли файл в чистом Objective-C. Пример:
http://philjordan.eu/article/strategies-for-using-c++-in-objective-c-projects
Идея в том, что вы все еще не можете реорганизовать файлы .mm, но вы можете реорганизовать весь другой код, даже если он включает код Objective-C ++.