gpt4 book ai didi

d - 从定义中拆分声明

转载 作者:行者123 更新时间:2023-12-04 03:00:44 25 4
gpt4 key购买 nike

我真的很想使用 D,因为它的语言结构所以做了很多我关心的事情比 C++ 更好,但几乎是强制 GC (issue handled [sort of] here),运算符重载的功能稍弱(除了opDispatchopDispatch 很性感),下面的问题有点让我失望。

在 D 中是否可以从定义中拆分方法声明?如果是这样,怎么做?如果不是,为什么?

“如何”的激励示例:在二进制对象旁边提供一个小的接口(interface)函数头文件,与 C 头文件和库一样,以便将实现隐藏在用户代码编写者的视线之外.偏好:不取决于用户代码是否已经破解了垃圾收集器或只是在没有运行时的情况下进行编译(such as this 可在评论 here 中找到)。

最佳答案

如果我写一个像这样的 D 文件:http://arsdnet.net/dcode/iface/test.d你用 dmd -c 编译,你会看到它没有错误;这是一个有效的 D 文件。该语言允许您编写没有实现的函数原型(prototype)。

.di 文件就是这样,只是文件名不同。

然后给出 main:http://arsdnet.net/dcode/main.d如果你编译 dmd main,它会在看到“import iface.test;”时自动搜索 iface/test.d,找到那个 .d 文件,或者如果你重命名它但同样的东西,找到 .di,并获取你的接口(interface)定义.

dmd main 将因链接器错误而失败,因此我们需要实现它:http://arsdnet.net/dcode/impl.d注意: impl 不会导入模块,因此它从不检查其他文件。保持 .di 和 .d 文件同步是这里的棘手部分之一,除非您自动生成接口(interface)文件,因为未定义的方法会产生链接器错误,但方法的顺序很重要:它必须匹配,所以这样做变量列表(如果有任何公共(public)变量)。否则,使用代码和实现代码将无法在类的布局上达成一致。

同样,它会自动检查,实现文件根本不查看“头”文件,因此这与 C++ 的主要区别在于您只编写一次头文件,然后在使用程序和实现文件中都使用它。

您会注意到实现文件也列出了类等。 D 不支持 void MyClass::add(int a) {} 语法 C++ 必须在类外编写方法。

据我所知,没有办法强制实现文件查找头文件,如果将两者都放在命令行上,则会得到:“错误:来自文件 iface/test.d 的模块 iface.test 冲突来自文件 impl.d 的另一个模块测试”

推荐使用 .di 文件的方式是使用 dmd -H 自动生成它们。这会读取完整的实现文件并删除函数体,只留下定义。当他们说它是编译器的一个特性时,这部分可能是关键 - .di 文件是有效的标准 D,但通过编译器选项生成,不一定需要是其他编译器的一部分。

关于d - 从定义中拆分声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18068161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com