【问题标题】:Is there a way of compiling C11 to C89?有没有办法将 C11 编译成 C89?
【发布时间】:2013-10-07 22:10:18
【问题描述】:

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

我正在从事一个针对多个设备的(爱好)项目。

有没有办法将 C11 代码库编译(转译?)成 C89?

(否则我将不得不像 1989 年那样编写代码。)

【问题讨论】:

  • 欢迎来到我的世界——我的最小公分母是 Microsoft MSVC,它甚至还不支持 C99。
  • 您使用了哪些 C11 特有的功能?
  • @CharlieBurns 当然不是。 K&R 参数仅在 K&R C 中是强制性的。C89 允许现代原型。
  • 如果不是 C.11 请求,我会推荐Comeau C。它将 C.99 代码编译成 C.90 代码。
  • 你的目标是什么?移植 clang/llvm 会不会很困难?

标签: c gcc embedded clang


【解决方案1】:

正如卡尔·诺鲁姆 (Carl Norum) 一样:

你的目标是什么?移植 clang/llvm 会不会很困难?

这似乎是有前途的方法。
不需要移植您的目标,C89 的移植就足够了。

所以 clang 将你的代码编译为 llvm,然后将 llvm 编译为 c89,然后你就得到了。

【讨论】:

【解决方案2】:

不,我不认为所有 C11 都有可能。 C11 具有 C89 或 C99 中根本不存在的功能:_Generic_Atomic_Thread_Alignof、在订购前明确排序、未命名的 structunion 成员......这些不在旧版本中有对应部件,并且真的很难模仿

对于这些功能中的任何一个,您都必须依赖目标编译器的扩展,因此对于给定编译器的某些功能可能是可行的。但是编写这样一个将纯 C89 作为通用目标的工具将是一场噩梦。你最好直接实现一个C11编译器。

【讨论】:

  • 如果不需要获取可读的源代码,应该可以使用 clang/llvm 进行转换
  • @jeb,我不太确定。以某种方式实现某些新结构,当然可以使用一些难看的代码。但是 C11 在保证数据一致性方面存在细微差别,这可能难以映射到 C89。问题是,当从一个标准转移到下一个标准时,所有的努力都是为了让旧标准的符合程序符合新标准。但在旧标准中具有未定义行为的程序可能在新标准中有效。在不触发 UB 的情况下,很难将它们“翻译”回旧标准。
  • 但是由于 C11 可以翻译为 asm 或在本例中为 llvm,因此您可以从这个 asm/llvm 代码创建有效的 c89 代码。
  • @jeb,我不确定您是否采用为一种架构生成的汇编程序,将其反汇编为 C89,然后在不同的平台上编译,您将拥有相同的属性和一致性保证你有你原来的 C11 代码。事实上,这甚至是不太可能的。
  • 但由于所有 (C89/C11/asm/llvm) 都已完成,很明显必须可以将每个变体转换为其他变体。 C11 的新特性在这里没有那么重要,因为将它们也转换为 asm 必须很简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多