10

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

4

3 回答 3

8

基于 Clang 的源到源转换器:

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

于 2013-03-07T17:06:41.913 回答
3

商业Comeau C/C++ 编译器可以做到这一点。

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

于 2012-05-29T18:02:56.620 回答
0

你需要的是一个程序转换系统。这样的工具读取源代码,构建编译器数据结构(例如抽象语法树,允许您在这些结构上应用(源到源)转换,然后可以从修改后的数据结构重新生成源。

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

许多人可能会建议您需要一个 C99 解析器。实际上,这是不正确的。要对典型的计算机语言进行任何有趣的转换,您需要符号表数据、一些数据流等。有关更多详细信息,请参阅我关于解析后的生活的文章,以及 DMS 如何提供这种生活。

其中一个方面是您如何编码替换结构初始化程序。您可以通过遍历 C99 AST、找到此类结构初始化程序并在程序上破解树的自定义代码来做到这一点。是的,这行得通,但这并不容易,您必须大量了解树的结构。DMS 提供源到源的重写,因此您可以编写识别您想要修改的习语的模式,以及生成生成习语的模式,所有这些都使用 C 表面语法。

于 2012-05-29T17:59:42.400 回答