有没有一种将C11编译为C89的方法?

18

我的(嵌入式)目标设备只有C89编译器。

我正在开发一个针对多种设备的(业余)项目。

是否有一种方法可以将C11代码库编译成C89代码?

(否则我只能像1989年那样编码了,字面上的意思。)


6
欢迎来到我的世界 - 我的最低公共分母是Microsoft MSVC,它甚至还不支持C99。 - Paul R
11
你使用了哪些C11特有的功能? - SheetJS
3
当然不是。K&R参数只在K&R C中是强制的。C89允许现代原型。 - Pascal Cuoq
3
我理解你的痛苦,@PaulR。也许在2013年,一些承诺中的C99特性会在MSVC中得到支持。虽然我不抱太大希望。 - ldav1s
5
你的目标是什么?将clang/llvm移植过来会很难吗? - Carl Norum
显示剩余8条评论
2个回答

9
我不认为将C11全部转换为C89或C99是可能的。因为C11有一些在C89或C99中并不存在的特性:_Generic、_Atomic、_Thread、_Alignof、定义良好的顺序和匿名结构和联合成员...这些在旧版本中没有对应的特性,如果要模拟实现,会非常困难。
对于任何这些功能,您必须依赖目标编译器的扩展,在某个给定编译器中某些特性可能是可能的。但是编写这样的工具会是一场噩梦,如果你想让你的通用目标是C89,你最好直接实现一个C11编译器。

如果不需要获取可读的源代码,使用clang/llvm进行转换应该是可能的。 - jeb
@jeb,我不太确定。以某种方式实现一些新构造肯定是可能的,但C11在数据一致性方面有微妙的差异,这可能很难映射到C89。问题在于,从一个标准转移到另一个标准时,所有的努力都是为了使符合旧标准的程序符合新标准。但是,在旧标准中具有未定义行为的程序可能会在新标准中变得有效。将它们“翻译”回旧标准将非常困难,而不触发该UB。 - Jens Gustedt
@jeb,我不确定您是否采用为一种架构生成的汇编语言,将其反汇编为C89,然后在不同平台上编译,您是否具有与原始C11代码相同的属性和一致性保证。实际上,这甚至是相当不可能的。 - Jens Gustedt
但是由于所有的(C89/C11/asm/llvm)都是图灵完备的,显然可以将每个变体转换为另一个变体。C11的新特性在这里并不那么重要,因为将它们转换为汇编语言也应该很简单。 - jeb
@jeb,那不是我说的。显然你可以将新功能转换为asm。困难的是将它们反汇编为C89,并具有与原始C11代码完全相同的属性,无论使用哪个符合C89标准的编译器进行编译。 - Jens Gustedt
显示剩余2条评论

3
作为卡尔·诺鲁姆的评论:
“你的目标是什么?将clang / llvm移植过来难吗?”
这似乎是一个有前途的方法。
不需要为您的目标进行移植,C89的移植就足够了。
因此,clang将您的代码编译为llvm,然后将llvm编译为c89,然后您就可以得到它。

2
C后端已被移除 :-( http://llvm.org/releases/3.1/docs/ReleaseNotes.html#whatsnew - fadedbee

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