您现在的位置是:首页 >技术教程 >d更好的C与C网站首页技术教程
d更好的C与C
原文
正如其他人所说,你不必呆在BetterC上限制自己.如果你不喜欢对象和/或其他高级特征,则可像用C一样低级简单地使用D.这在普通D和BetterC中一样有效.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_init和rt_term.带C接口的D库可提供内部调用Runtime.initialize的extern(C)初化函数.
D与C是ABI兼容的,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头文件,你就可以开始了.





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结