【问题标题】:Use Clang to convert C++ to C code使用 Clang 将 C++ 转换为 C 代码
【发布时间】:2016-05-06 22:27:31
【问题描述】:

我知道llvm可以用来将c++转换成c代码。我想知道clang 是否可以做同样的事情(看到clang 是从llvm 派生的)。

那我可以用clang把c++代码转成c代码吗?

如果你想知道我为什么要这样做,这是我的场景:

PIC 是一家微控制器制造商,不生产 c++ 编译器,但为他们的大部分产品生产 c 编译器。我想用 c++ 编写,然后作为构建过程的一部分,将 c++ 代码转换为临时 c 文件,然后将其输入 PIC 编译器,中提琴我已经为 PIC micro 编写了 c++ 代码。

【问题讨论】:

  • “我知道 llvm 可用于将 c++ 转换为 c 代码” - 怎么样? LLVM 是一个编译器基础设施库。它甚至不知道 C 或 C++。也许你最好阅读文档 LLVM 和 clang 实际上是什么。
  • 嗯,很有趣。但我不会称之为 C 代码。它更像是带有 C 语法的汇编程序(阅读正文)。您绝对不希望在您的项目中使用此类代码(而且每个高级人员都会拒绝此类代码)。
  • @Olaf 这实际上就是我所需要的.....这就是我需要它的原因:PIC(一个微控制器品牌)没有为它的任何微控制器制作c++ 编译器(除了真的很花哨),但它确实使 c 编译器......所以我想使用一个转换器来生成临时输入 PIC 编译器......我将更新问题以反映这一点
  • 如果是 PIC32:使用 gcc(IIRC 他们已经为此提供了 gcc)。对于 PIC16:您也可以使用 gcc。但是,对于这两种变体:对 PIC16 使用 C++ 编码风格将导致糟糕的代码。不仅在源代码级别,而且 - 更糟糕的是 - 在机器级别。这些 MCU 并非真正设计为支持 C,更少支持具有 OOP 功能的 C++。您真的应该更改为更适合的东西,例如 MSP430 或 ARMv6M/7M,或者您编写真正的 C 代码。请注意,转换后的 C 代码很可能也不能很好地优化,众所周知,Microchip 编译器在这方面做得很差。

标签: c++ c clang llvm frontend


【解决方案1】:

Clang 可以读取 C++ 并发出 LLVM IR。您似乎知道 LLVM 可以读取 IR 并发出 C(来自您自己的链接:http://llvm.org/releases/3.1/docs/FAQ.html#translatecxx)。所以 Clang 不能直接发出 C,但它可以发出 LLVM IR,然后你转身转换为 C。两步,Clang 就是其中之一。

【讨论】:

  • 请注意,大约四年前,C 后端功能是 removed。你需要回到过去,以相当的方式使用它。谨慎行事。
  • @BenjaminBarenblat:哇,太糟糕了。好吧,我刚刚发现(但尚未测试)这个:github.com/draperlaboratory/llvm-cbe
【解决方案2】:

或许可以分两步将C++转为C:首先使用Emscripten将C++编译为WebAssembly,然后使用wasm2c将生成的WebAssembly模块转为C。Emscripten使用Clang将C++编译为WebAssembly ,所以很可能用这种方式生成C源代码。

由于 Clang 将 C++ 编译为 LLVM,因此也可以使用 LLVM 反编译器(例如 retdec)将其转换为 C。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多