将C99代码转换为C89

时间:2012-05-29 17:50:30

标签: c visual-c++ c99

如何将c99源代码自动转换为c89?我想用Visual C ++编译c99库,但MSVC只支持c89。许多更改只是语法,例如struct initializers,您可以自动编写“de-c99”代码的工具。这个预处理器是否存在?

3 个答案:

答案 0 :(得分:7)

基于Clang的源到源翻译:

https://github.com/libav/c99-to-c89/

答案 1 :(得分:3)

广告Comeau C/C++ compiler可以做到这一点。

或者,使用适当的C编译器(例如GCC或Clang via MinGW,Pelles C,Intel)并链接生成的目标文件。但是,并非所有这些(特别是MinGW)都支持Microsoft的调试格式。

答案 2 :(得分:1)

您需要的是program transformation system。这样的工具读取源代码,构建编译器数据结构(例如abstract syntax trees),允许您在这些结构上应用(源到源)转换,然后可以从修改的数据结构中重新生成源。

你需要一个可以解析C99,并转换为C89。我们DMS Software Reengineering Toolkit可以使用C Front End(可以处理C的两种方言,包括MSVC 89,以及ObjectiveC)来做到这一点。如果你想这样做,就必须有一个成熟的解析器。

许多人可能会建议您需要的所有是C99解析器。实际上,事实并非如此;要对典型的计算机语言进行任何有趣的转换,您需要符号表数据,一些数据流等。有关详细信息,请参阅我在Life After Parsing上的文章,以及DMS如何提供生命。

一个这样的方面是如何编码替换struct初始化器。您可以通过自定义代码执行此操作,该代码遍历C99 AST,查找此类结构初始化程序,并在程序上破解树。是的,这是有效的,但这并不容易,你必须知道大量的树的结构。 DMS提供源到源的重写,因此您可以编写识别您想要修改的习语的模式,以及生成结果习语的模式,所有这些都使用C表面语法。