如果使用 C 库,D 是否向后兼容 C



如果我导入 std.c 库而不是在 C 中包含库,C 代码会使用 D 编译器编译,还是存在其他反词兼容性问题?

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

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

另请注意,std.c已弃用;请改用core.stdc

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

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

答:是的。您可以使用 C 库。更多关于这个 这里.

Q2:C 代码会使用 D 编译器编译吗?

答:从来不打算让 D 编译器的实现能够编译 C 代码。但是,许多 C 代码可以编译,因为 D 匹配 C 编译器的数据类型、布局和函数调用/返回序列。正如Zor指出的C样式函数指针语法,C样式数组指针语法已被弃用。

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

  • 与 C 接口
  • 与C++接口
  • 将 C.h 文件转换为 D 模块

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

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

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

相关内容

  • 没有找到相关文章

最新更新