【问题标题】:What's the relationship between Objective-C source code and after clang -rewrite-objc C++ code?Objective-C源码和clang-rewrite-objc后的C++代码有什么关系?
【发布时间】:2019-03-16 15:35:38
【问题描述】:

当我编写一些 Objective-C 源代码时,我可以使用clang -rewrite-objc FILENAME.m 将这段代码翻译成 C++ 源代码。 C++源代码和Objective-C原代码有什么关系?

Objective-C 是 C(但不是 C++)的超集,那么为什么 Objective-C 可以翻译成 C++,而不是 C?在 iOS 或 macOS 上编译、链接和运行 Objective-C 代码时,是先预编译成 C++,然后再链接等等?

【问题讨论】:

  • 我在这里找到了 bbum 的答案stackoverflow.com/questions/44561285/…。但我还是很困惑他为什么说-rewrite-objc 使得 Obj-C 可以被 Visual Studio 编译?如果我们使用 Xcode 构建我们的 Obj-C 项目,是否存在 -rewrite-objc 步骤?
  • Apple 有适用于 Windows 的程序。 iTunes 是最知名的。所以我想他的意思是这些程序是在 Windows 的 Visual Studio 中开发的,因此它们可以为 Windows 构建。因此,要在 Visual Studio 构建的 Windows 版本中重用这些程序的 macOS 版本中的代码,他们必须将现有的 Obj-C 代码转换为 C++,以便 VS 可以构建它。

标签: c++ objective-c clang


【解决方案1】:

Objective-C 仍然可以直接翻译成 C。 ObjC 运行时 API 中没有任何需要 C++ 的东西,尽管内部结构到处都是用 C++ 实现的。我认为这没有改变。然而,重写器可能正在生成 C++,因为这是最方便/最有效的生成目标。

Xcode 的构建过程中没有翻译步骤。它编译native Objective-C 代码;也就是说,ObjC 直接转换为编译器用来生成可执行文件的临时格式,就像 C++、C 和编译器原生支持的任何其他语言一样。

翻译器显式存在,因为 Visual Studio 中没有 Objective-C 编译器。在重写器之前,使用不同的编译器将 ObjC 代码编译为 Windows 上的库,然后将这些库与在 Visual Studio 中编译的代码结合起来生成最终的应用程序。

它确实有效,但调试确实非常复杂,因为在两种代码生成样式之间遍历的任何调用堆栈都无法从单个调试器中进行调试!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多