您现在的位置是:首页 >技术教程 >d更好的C与C网站首页技术教程

d更好的C与C

fqbqrr 2023-05-02 22:30:02
简介d更好的C与C

原文
正如其他人所说,你不必呆在BetterC限制自己.如果你不喜欢对象和/或其他高级特征,则可像用C一样低级简单地使用D.这在普通DBetterC中一样有效.C标准库和第三方C库在这两个时候都可用.

我确实鼓励逐渐试用在C甚至BetterC中没有的高级特征.很可能你不会喜欢所有这些,这没问题.
如,经常,D代码基只在少数情况下,使用面向对象编程和异常.不过,几乎可肯定,你会喜欢比C更好的东西.
如,我从没听说有人更喜欢C标准库concat函数而不是D串(~)附加操作符,除非它需要无垃集(即便如此,D也是设计了一些切片非零终止串而不是concat等).

:当然可用BetterC,但长远看,学会与GC共存更实用:这只是心理成本.
另外,即使要避免垃集,也不一定需要BetterC.
仅当你想完全避免依赖DRuntime时,你才需要BetterC,也许是编写从C端调用的库,或写代码时没有DRuntime端口的平台.
即使此时,你也有其他方法来完成相同的任务.

有不有BetterC,D都可制作C库.
不同在,原版D库DRuntime依赖性,表明必须初化运行时.可用D编写main()函数,或在调用其他D函数之前,在C端手动初化运行时来实现.
不确定具体细节,但我相信这不会太难.似乎core.runtime这里中的C链接函数可解决问题.
BetterC中,没有需要初化DRuntime,但对常见的应用,DRuntime值得多次初化它.

如果是为了core.runtime中的extern(C)函数,则不必在C端调用rt_initrt_term.带C接口D库可提供内部调用Runtime.initializeextern(C)初化函数.
D与CABI兼容的,BetterC与它无关.如果只是为了与C库链接,而使用BetterC,就会削弱你的D代码.这不是个好用例.

可从C调用extern(C)标记的D函数.只要有定义函数C头文件和你有的自定义类型的相应C声明,C代码不会知道,它正在调用D库.

D库中:

// 可以从C调用此函数
extern(C) void functionForTheCAPI(const(char)* str) {
    import std.conv : to;
    doSomething(to!string(str));
}

//无法从C调用的D函数
void doSomething(string s) { ... }

相应的C头文件中:

extern void functionForTheCAPI(const char* str);

只需在C代码中包含C头文件,并与D库链接,你就可以开始了.确保在D库CAPI中的某个位置包含初化DRuntime的函数:

import core.runtime;

extern(C) int initialize() { return Runtime.initialize(); }

并把声明添加到C头文件,你就可以开始了.

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。