7

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

4

3 回答 3

6

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

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

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

于 2012-06-02T16:27:38.227 回答
3

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

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

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

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

答:D 编译器的实现从未打算编译 C 代码。但是,由于 D匹配 C 编译器的数据类型、布局和函数调用/返回序列,因此可以编译大量 C 代码。正如 Zor 指出的C-style function pointer syntax,而C-style array pointer syntax已被弃用。

于 2012-06-02T19:41:53.687 回答
3

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

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

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

Now, C and D are very similar syntactically, so some sections of C code will compile just fine as D code, but programs as a whole will not. The general rule is that C/C++ code will either compile as valid D code with the same semantics, or it won't compile as D code. There are a few cases where that isn't true (e.g. static arrays are value types in D, unlike C/C++), but it is in almost all cases. This makes porting C/C++ code to D fairly easy, but it was never intended that D be backwards compatible with C code in the way that C++ is.

于 2012-06-03T04:43:06.653 回答