有没有办法将C ++编译为C代码?

时间:2011-02-19 10:54:20

标签: c++ c compiler-construction compiler-theory

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

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

开源会很棒!

5 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:16)

C ++ FAQ提供了一系列可能性:Is it possible to convert C++ to C?

简而言之,它表示您不能指望这会给您特别易读的代码。想想所涉及的复杂性;多重继承,虚函数解析,模板,运算符重载等等。没有 clean 简洁的方式在纯C中表达这些概念。如果你所有的都是可编译的C,不过,那么这可能是要走的路。

答案 2 :(得分:10)

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

我从未尝试过。

答案 3 :(得分:1)

  1. Comeau Computing提供基于Edison Design Group前端的编译器,可输出C代码。
  2. LLVM是一个可下载的编译器,可以发出C代码。另见这里和这里。以下是通过LLVM进行C ++到C转换的示例。 3.Cfront,由Bjarne Stroustrup和其他人在AT& T完成的C ++的原始实现,生成C代码。然而,它存在两个问题:自从90年代中期开始经历所有权变更的迷宫时,它很难获得许可证,并且开发在同一时间停止,因此它没有得到错误修复并且不支持任何较新的语言功能(例如,例外,命名空间,RTTI,成员模板)。
  3. 与流行的神话相反,在撰写本文时,没有任何版本的g ++将C ++翻译为C.这样的事情似乎是可行的,但我不知道有人实际上已经完成了(还)。
  4. http://www.cs.technion.ac.il/users/yechiel/c++-faq/convert-to-c.html

答案 4 :(得分:0)

  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风格,而不是真正的ANSIC。您将 想要在投资之前先测试一下是否对您有用 在您的代码中大量使用。例如,某些嵌入式系统仅接受 ANSI C。

    还请注意,它会生成功能强大但不可读的代码。一世 建议注释并维护您的C ++代码,不要担心 有关最终的C代码。

  3. 不幸的是,Comeau网站已死亡。相干建立在comeau上 并可能提供一些选择。他们已经预建了VM 一直维持到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