我有一个由用户使用 C++ 类配置的程序,并且应该使用相同的类来配置只能使用 C99(开放 CL 语言)子集的程序。
所以我的问题是:有没有办法将 C++ 编译为 C 代码?
开源会很棒!
我有一个由用户使用 C++ 类配置的程序,并且应该使用相同的类来配置只能使用 C99(开放 CL 语言)子集的程序。
所以我的问题是:有没有办法将 C++ 编译为 C 代码?
开源会很棒!
C++ FAQ 有一个可能性列表:是否可以将 C++ 转换为 C?.
简而言之,它说你不能指望这会给你特别可读的代码。想想所涉及的复杂性;多重继承、虚函数解析、模板、运算符重载等。在纯 C 中没有简洁明了的方式来表达这些概念。但是,如果您所追求的只是可编译的 C,那么这可能是去。
Comeau 编译器似乎能够做到这一点。来自Wikipedia “Comeau C/C++ 不是直接生成可执行文件,而是输出 C 代码,并且需要单独的 C 编译器才能生成最终程序。”
不过,我从未尝试过。
VisualGBD 是一个 Visual Studio 扩展,它允许您为嵌入式平台进行编译开发。它不是免费的,但有试用版。如果它适用于您的应用程序,我认为它值得。
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 代码。
不幸的是,Comeau 网站已经死了。Coherent 建立在 Comeau 的基础上,可能会提供一些选择。他们有预建的虚拟机,直到 2018 年才得到维护。
CLang可用但很久没更新了
http://www.cs.technion.ac.il/users/yechiel/c++-faq/convert-to-c.html