25

我有一个由用户使用 C++ 类配置的程序,并且应该使用相同的类来配置只能使用 C99(开放 CL 语言)子集的程序。

所以我的问题是:有没有办法将 C++ 编译为 C 代码?

开源会很棒!

4

5 回答 5

23

您可以使用clang C++ 前端来生成 llvm 字节码,并用于llc发出 C 代码,请参阅llc doc,尤其是c选项。两者都是开源的,具有类似 BSD 的许可证。

于 2011-02-19T11:00:34.993 回答
20

C++ FAQ 有一个可能性列表:是否可以将 C++ 转换为 C?.

简而言之,它说你不能指望这会给你特别可读的代码。想想所涉及的复杂性;多重继承、虚函数解析、模板、运算符重载等。在纯 C 中没有简洁明了的方式来表达这些概念。但是,如果您所追求的只是可编译的 C,那么这可能是去。

于 2011-02-19T10:56:39.770 回答
10

Comeau 编译器似乎能够做到这一点。来自Wikipedia “Comeau C/C++ 不是直接生成可执行文件,而是输出 C 代码,并且需要单独的 C 编译器才能生成最终程序。”

不过,我从未尝试过。

于 2011-02-19T11:01:50.750 回答
4
  1. VisualGBD 是一个 Visual Studio 扩展,它允许您为嵌入式平台进行编译开发。它不是免费的,但有试用版。如果它适用于您的应用程序,我认为它值得。

    https://visualgdb.com

  2. LLVM 是一个不错的选择。

    http://llvm.org/docs/FAQ.html#translatecxx

    它处理一些代码,但对于更复杂的实现会失败,因为它还没有完全更新一些现代 C++ 约定。因此,请尝试经常编译您的代码,直到您对允许的内容有所了解。

    对于 9.0.1 版,命令行中的使用语法如下:

    clang -c CPPtoC.cpp -o CPPtoC.bc -emit-llvm
    clang -march=c CPPtoC.bc -o CPPtoC.c
    

    对于旧版本(不确定转换版本),请使用以下语法:

    llvm-g++ -c CPPtoC.cp -o CPPtoC.bc -emit-llvm
    llc -march=c CPPtoC.bc -o CPPtoC.c
    

    请注意,它创建了 C 的 GNU 风格,而不是真正的 ANSI C。在您对代码投入过多之前,您需要测试它是否对您有用。例如,一些嵌入式系统只接受 ANSI C。

    另请注意,它会生成功能但相当不可读的代码。我建议评论和维护您的 C++ 代码,而不用担心最终的 C 代码。

  3. 不幸的是,Comeau 网站已经死了。Coherent 建立在 Comeau 的基础上,可能会提供一些选择。他们有预建的虚拟机,直到 2018 年才得到维护。

    https://www.autometer.de/unix4fun/coherent/#inst_coh

  4. CLang可用但很久没更新了

    http://www.softwarepreservation.org/projects/c_plus_plus/cfront/release_3.0.3/source/cfront_3_0_3.tgz

于 2020-03-09T18:02:51.210 回答
2
  1. Comeau Computing 提供了一个基于 Edison Design Group 前端的编译器,用于输出 C 代码。
  2. LLVM 是一个可下载的编译器,它发出 C 代码。另请参阅此处和此处。这是通过 LLVM 进行 C++ 到 C 转换的示例。
  3. Cfront 是 C++ 的原始实现,由 Bjarne Stroustrup 和 AT&T 的其他人完成,它生成 C 代码。但是它有两个问题:自 90 年代中期开始经历所有权变更的迷宫以来,很难获得许可证,同时开发停止,因此它没有得到错误修复,也不支持任何较新的语言特性(例如,异常、命名空间、RTTI、成员模板)。
  4. 与流行的神话相反,在撰写本文时,还没有将 C++ 转换为 C 的 g++ 版本。这样的事情似乎是可行的,但我不知道是否有人实际做过(目前)。

http://www.cs.technion.ac.il/users/yechiel/c++-faq/convert-to-c.html

于 2017-10-09T14:34:07.537 回答