【问题标题】:Xcode C++ and Objective-C refactoringXcode C++ 和 Objective-C 重构
【发布时间】:2013-03-28 04:58:14
【问题描述】:

有没有办法在 Xcode 中重构混合 C++/Objective-C 代码?我正在使用 Cocos2D 和 Box2D 编写游戏,而 Box2D 是用 C++ 编写的,所以我编写的每个类都应该有 .mm 扩展名,因此当我尝试例如重命名变量,我收到类似“Xcode 只能重构 C 和 Objective-C 代码”的消息。

提前致谢!

【问题讨论】:

  • 它是“重构”而不是“折射”——那将是一个望远镜;)
  • 对于重构我有时使用appcode,它的重构更强大。但是加载速度很慢,所以对我来说,在 xcode 中重命名仍然更实用。

标签: c++ objective-c xcode cocos2d-iphone box2d


【解决方案1】:

Xcode 在重构方面非常有限,即使是简单的 Obj-C。它基本上是重命名,甚至不能在 cmets 中重命名。如果它说它不能做某事,那么它可能不能。

重命名的唯一方法是使用find & replace。请注意,Xcode 可以处理正则表达式,因此它通常足够好。

当然,问题在于 find & replace 不了解编程语言,有时会添加一些额外的替换或忘记替换某些内容,因此要格外小心。每次重构后都需要进行干净的构建,以检查所有内容是否正确重命名。

您也可以使用命令行工具(例如sed)来实现相同的目的。

【讨论】:

  • 谢谢!我只是想知道人们在从事大型项目时通常会如何应对。他们也使用查找和替换工具吗?
  • @Terko 很难说。我想每个人都有点不同。另请注意,XCode 并不是市场上唯一的 IDE。这是默认设置并且是免费的,但它不是唯一的。我听说JetBrains 的参考非常好,它的主要特性之一是“可靠的重构”。我不知道它是否可以重构 Obj-C++,但它可能是比 XCode 更好的 IDE。
  • @Sulthan - 在许多方面它都非常优越,在其他方面则不是(参见上面 Stefen 的评论)。我现在将 xCode 严格用于(罕见的)项目设置活动、(总是)组织者活动以及(从不)代码、测试和集成。如果他们能解决性能问题并添加缺失的功能,xCode 很快就会成为我的 ExCode。
  • @Sulthan - 请注意,重构不仅仅是重命名事物。大多数时候,我使用现代 IDE 的重构功能来提取方法、更改签名或在类/命名空间之间移动内容。
  • AppCode 上的 1.5 年变得相当稳定(仍然是偶尔的重构错误)所以这就是我们现在用于重构的......
【解决方案2】:

我正在构建的 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 可以重构我项目的每个类,当然除了包装器。

附:当然,当您需要在 Objective-C 类中使用包装器(例如 MyWorld)时,您必须导入 MyWorld.h 而不是 MyWorld.mm

【讨论】:

    【解决方案3】:

    您可能想在 github 上查看这个项目 - 这是一项正在进行的工作,但仍然:

    https://github.com/lukhnos/refactorial

    它是一个基于 Clang 的 c++ 重构工具(即 Xcode 本身所基于的编译器)。

    【讨论】:

    • 这个项目现在看起来已经死了。 :-/
    • 嗯 - AppCode 就是这样。
    【解决方案4】:

    我有某种解决方案 - 将 Objective-C 和 Objective-C++ 代码分开。有一些宏允许检测文件是否在纯 Objective-C 中使用。示例:

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

    这个想法是您仍然无法重构 .mm 文件,但您可以重构所有其他代码,即使它包含 Objective-C++ 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多