我有一个程序,用户使用C ++类进行配置,并且应该使用相同的类来配置只能使用C99子集(Open CL语言)的程序。
所以我的问题是: 是否有一种将C ++编译为C代码的方法?
开源的解决方案最好!
我有一个程序,用户使用C ++类进行配置,并且应该使用相同的类来配置只能使用C99子集(Open CL语言)的程序。
所以我的问题是: 是否有一种将C ++编译为C代码的方法?
开源的解决方案最好!
C++ FAQ中列举了一些可能性:是否可以将C++转换为C?。
简而言之,它表示您不能期望通过此方法得到特别易读的代码。考虑到涉及的复杂性有:多重继承,虚函数解析,模板,运算符重载等,这些概念在纯C语言中没有清晰简洁的表达方式。但是,如果你只需要可编译的C代码,那么这可能是一个可行的方法。
llc
的输出代码易读性很高。 - rubenvb看起来Comeau编译器能够做到这一点。根据维基百科,“Comeau C/C++不像其他编译器那样直接生成可执行文件,而是输出C代码,并需要一个单独的C编译器才能生成最终程序。”
虽然我从未尝试过。
VisualGBD是一款Visual Studio扩展,允许您开发和编译嵌入式平台。它不是免费的,但有试用版。如果适用于您的应用程序,我认为它是值得的。
LLVM曾经是一个不错的选择,但现在已经停止了更新。(C后端已经被重新启用here,并且可能会使以下说明起作用)
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
请注意,它创建了GNU风格的C而不是真正的ANSI C。在您过度投入代码之前,请测试一下这是否对您有用。例如,某些嵌入式系统只接受ANSI C。
还要注意,它生成的代码功能性强但相当难以阅读。我建议注释和维护您的C++代码,不要担心最终的C代码。
遗憾的是Comeau网站已经关闭。Coherent是基于Comeau构建的,可能会提供一些选项。他们有预构建的虚拟机,最近更新至2018年。
Cfront可用,但已经很长时间没有更新了。
http://www.cs.technion.ac.il/users/yechiel/c++-faq/convert-to-c.html
extern "C"
函数,然后使用能够生成与您的C编译器使用的相同链接器兼容的对象文件的C++编译器进行编译,并将所有内容链接在一起。如果您的平台没有提供兼容的C和C++编译器(我认为最可能的原因是它根本没有提供C++编译器/运行时),则转换将是最后的选择。 - Steve Jessop