【问题标题】:Is D backwards compatible with C if you use the C libraries?如果您使用 C 库,D 是否与 C 向后兼容?
【发布时间】:2012-06-02 16:21:48
【问题描述】:

如果我导入 std.c 库而不是将库包含在 C 中,C 代码是否可以使用 D 编译器进行编译,或者是否存在其他 backwords 兼容性问题?

【问题讨论】:

  • 绝对可能。 :-) 根据D overview page“10。如果 D 代码看起来与 C 代码相同,则使其行为相同或发出错误。”)。所以有可能一些 C 代码在 D 下编译运行良好,但我认为你不能说所有 C 代码都能编译运行。

标签: c d backwards-compatibility phobos


【解决方案1】:

D 中有几个细微之处会使 C 代码的行为不完全符合您的要求。例如,整数提升规则并不完全相同(但几乎相同),并且初始化规则不同(例如,浮点值——包括此类数组——被初始化为 NaN)。此外,最近不推荐使用 C 函数指针语法,因此您可能必须将某些 C 类型语法转换为等效的 D 语法。

不过,总的来说,我们非常关注向后兼容性,大多数 C 代码应该在 D 中编译得很好(或只进行非常少量的更改),其语义与在 C 中相同。

还要注意std.c 已被弃用;请改用core.stdc

【讨论】:

  • 当然,您的 C 代码中的所有预处理器技巧都必须更改。
【解决方案2】:

您的问题与您在 OP 正文中提出的问题不同。

Q1:如果你使用 C 库,D 是否向后兼容 C?

答:是的。您可以使用 C 库。有关此here 的更多信息。

Q2:C 代码可以用 D 编译器编译吗?

A:D 编译器的实现从未打算编译 C 代码。但是,由于 D matches C compiler's data types, layouts, and function call/return sequences,很多 C 代码会编译。正如 Zor 指出的 C-style function pointer syntaxC-style array pointer syntax 已被弃用。

【讨论】:

    【解决方案3】:

    您将永远无法获取 C 或 C++ 文件并编译为 D 代码,并且您不能只是 #include D 中的 C 标头。D 是向后与 C 或 C++ 兼容。相反,可以在您的 D 代码中声明 extern(C) 函数并像调用 D 函数一样调用这些 C 函数(当然,您必须链接到定义它们的 C 库)。见

    有关从 D 调用 C 代码的详细信息。

    druntime(包含 core.* 模块)声明了相当多的标准 C 和 OS 函数(在 core.stdc.* 和 core.sys.* 模块中),但您必须查看在运行时文件中自己查看它们是什么,因为此时它们没有正确记录。对于您想要调用的任何其他 C 函数,您可以自己轻松地为它们创建声明,如上面的链接中所述。

    现在,C 和 D 在句法上非常相似,因此 C 代码的某些部分可以像 D 代码一样编译,但整个程序不会。一般规则是 C/C++ 代码要么编译为具有相同语义的有效 D 代码,要么不编译为 D 代码。在少数情况下这是不正确的(例如,静态数组是 D 中的值类型,与 C/C++ 不同),但几乎在所有情况下都是如此。这使得将 C/C++ 代码移植到 D 相当容易,但 D 从未像 C++ 那样向后兼容 C 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      相关资源
      最近更新 更多