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

时间:2012-06-02 16:21:48

标签: c d backwards-compatibility phobos

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

3 个答案:

答案 0 :(得分:6)

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

一般而言,非常注重向后兼容性,并且大多数 C代码应在D中编译正确(或进行非常少量的更改),其语义与C中相同。

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

答案 1 :(得分:3)

您的问题与您在OP机构中提出的问题有所不同。

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

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

Q2: C代码是否会用D编译器编译?

答:D编译器的实现从来没有打算能够编译C代码。但是,很多C代码都会编译,因为D matches C compiler's data types, layouts, and function call/return sequences 。正如Zor指出C-style function pointer syntaxC-style array pointer syntax已被弃用。

答案 2 :(得分:3)

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

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

druntime(包含核心。*模块)有很多标准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代码。