您现在的位置是:首页 >技术教程 >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头文件
,你就可以开始了.