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

cl_*_*ger 18 c c++ compiler-construction compiler-theory

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

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

开源会很棒!

ton*_*nio 18

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

  • 如果生成的代码除了构建之外不需要做任何事情,那么这是最好的选择.不要指望`llc`的输出是任何可读的代码. (3认同)
  • 只是为了注意.`llc -c`选项似乎已被弃用.[手册](http://llvm.org/docs/CommandGuide/llc.html)不再提及它了. (3认同)
  • 它被认为是有问题的,没有人愿意维护它(至少这是它被弃用的原因) (3认同)
  • @cl_progger:如果你想要小巧,高效,可读的C代码,那么我认为最好的办法是用C语言编写它.好吧,所以CUDA会允许你使用C++来实现你想要的东西,但是如果OpenCL没有和相同的配置代码需要同时工作......不是世界上的所有东西都需要成为一个类,是吗?;-) (2认同)

Oli*_*rth 16

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

简而言之,它表示您不能指望这会给您特别易读的代码.想想所涉及的复杂性; 多重继承,虚函数解析,模板,操作符重载,等等,等等.有没有干净的表达纯C.这些概念如果所有你后是编译的C,虽然的简洁的方式,那么这可能是途中走.

  • @Fred:我并不是说这些实施起来“困难”,但实施起来非常“乏味”!但是,是的,你是对的;主要障碍是冗长。 (2认同)

Ren*_*ger 10

Comeau编译器似乎能够做到这一点.来自维基百科 "Comeau C/C++不是直接生成可执行文件,而是输出C代码,需要单独的C编译器才能生成最终程序."

不过,我从未尝试过.


Vot*_*fee 5

  1. VisualGBD 是一个 Visual Studio 扩展,允许您为嵌入式平台进行编译开发。它不是免费的,但有试用版。如果它适合您的应用程序,我认为值得。

    https://visualgdb.com

  2. LLVM一个不错的选择,但它已停止使用。(C后端已在这里复活,并且可以使以下指令起作用)

    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
    
    Run Code Online (Sandbox Code Playgroud)

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

    llvm-g++ -c CPPtoC.cp -o CPPtoC.bc -emit-llvm
    llc -march=c CPPtoC.bc -o CPPtoC.c
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  3. 不幸的是,科莫网站已经关闭。Coherent 基于 comeau 构建,可能会提供一些选项。他们预先构建了虚拟机,并于 2018 年进行了维护。

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

  4. Cfront可用但已经很久没有更新了

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