如果我导入std.c库而不是在C中包含库,C代码是否会用D编译器编译,还是存在其他向后兼容性问题?
答案 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 syntax,C-style array pointer syntax已被弃用。
答案 2 :(得分:3)
你永远无法获取C或C ++文件并以D代码编译,而且你不能只是{D}中的#include
C标题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代码。