自动将C源代码翻译为C89或C90版本

3

我正在开发一个C/C++库,使用的是支持最新C和C++标准的GNU编译器。

我想让我的库与只支持C89/C90标准的VC++编译器兼容,而这些标准不允许在函数体内的其他语句之后声明变量。

有没有工具可以将所有变量声明放在函数体的开头?

由于我的库非常庞大,使用此工具可以轻松完成此任务。


2
可能有编译器选项来强制执行更严格的一致性,或在不一致时生成警告。 - Steve Townsend
你可以使用-std=c90标志来为您标记,但我不知道是否有工具可以自动转换源代码。不过我认为这已经改变了,因为我认为新的VC已经放宽了这一点? - Rup
9
我对为什么标记为 C++ 有点困惑,您似乎想确保您的 C 代码只使用 C90,那么 C++ 又如何参与其中呢? - PlasmaHH
我只想指出,如果你想在新编译器上编译旧的C库,那么你也需要彻底测试一下旧的C库在新编译器上的情况。 - djechlin
5
简单问题:为什么支持使用VC++编译C代码?根据互联网传言,似乎没有计划使VC++成为支持现代C特性的C编译器。我知道为VC++支持C代码很麻烦。一种有点hacky的解决方案是告诉VC++将.c文件编译为C++(你可以在文件属性级别上这样做)。但是,这样你就会失去C99的一些好特性,例如指定初始化项。如果您的库只使用有效C的子集,则最好使用VC++将其编译为C++代码。 - Josh Petitt
显示剩余5条评论
1个回答

4
抱歉,反驳一下,Visual C++ 不是 C 编译器。它可能是某种旧的、过时的语言(确切地说是 22 年过时的语言)的编译器,但不是 C。你应该建议那些寻求支持的人改用其他编译器,而不是使用有缺陷的编译器。
如果这个解决方案真的超出了你的选择范围(其实并没有),那么你可以查找类似的主题: 如何使用 clang 编译 c99-to-c89 转换器? https://github.com/libav/c99-to-c89/ 如果你认为我的话没有意义,请再想一想:这是一个 22 年过时的 C 编译器。想想全世界人们为支持它所花费的努力和金钱。
编辑:顺便说一下,这就是 C: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

http://www.open-std.org/jtc1/sc22/wg14/www/standards


这在评论中已经讨论过了,但我认为需要作为答案说出来,所以点个赞。 - djechlin
2
C89/90并不是“过时22年”。即使我们认为C99的诞生是一件过时的事件,它也发生在14年前。 - AnT stands with Russia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接