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

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

绝对可能。根据D概述页面的说法:“10.当D代码看起来与C代码相同时,要么使其行为相同,要么发出错误。”因此,某些C代码在D下编译和运行良好是可能的,但我认为不能说所有的C代码都能编译和运行。 - Bob Jarvis - Слава Україні
3个回答

6
在D语言中有一些微妙之处,可能会使C代码的行为与你期望的不完全一致。例如,整数提升规则不完全相同(但几乎相同),初始化规则不同(浮点值--包括这种数组--被初始化为NaN,例如)。此外,C函数指针语法最近已被弃用,因此您可能需要将一些C类型语法翻译为等效的D语法。
总体而言,D语言非常注重向后兼容性,大多数 C代码应当可以在D中编译成功(或者只需进行极少量的修改)并保持与C中相同的语义。
另请注意,std.c已被弃用,请改用core.stdc

1
当然,你C代码中的所有预处理器hack都必须更改。 - Qwertie

3

3
您永远无法将C或C ++文件编译为D代码,并且不能仅使用#include C头文件在D中。D与C或C ++均不向后兼容。相反,您可以在D代码中声明extern(C)函数,并像调用D函数一样调用这些C函数(自然地,您必须链接它们所定义的C库)。有关从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代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接