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. 我在 Objective-C++ 中为我需要与之交互的 box2d 类创建了一些包装器(例如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.h而不是MyWorld.mm

于 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 回答