D拥有一个出色的模块系统,与C++相比,它可以大大缩短编译时间.根据文档,D仍然提供不透明的结构和联合,以便启用pimpl习语.我的问题是:如何在一个模块中声明嵌套结构(或联合)并在另一个模块中定义它?那是什么语法?
在C++中,标题看起来像这样
struct S {
...
struct Impl;
Impl * p;
};
Run Code Online (Sandbox Code Playgroud)
并且实现文件(cpp-file)将使用一些有趣的::
-syntax,如下所示:
#include "header.h"
struct S::Impl {
...
};
Run Code Online (Sandbox Code Playgroud)
如何在D中实现相同的功能?
D(至少DMD)使用.di
文件进行声明.它们有点等同于C .h
文件,但它们是可选的.D编译器可以.di
自动生成文件(当-H
指定开关时),虽然我相信目前所做的只是剥离函数体和单元测试.
这是使用.di
文件实现PImpl的一种方法:
mod.di
:
struct S
{
struct I;
I* pi;
}
Run Code Online (Sandbox Code Playgroud)mod.d
:
struct S
{
struct I
{
int v;
}
I* pi;
}
Run Code Online (Sandbox Code Playgroud)请注意,目前您有责任确保和文件中的字段S
相同- 如果它们不同,编译后的模块将对字段的布局方式有不同的了解,这可能会导致内存损坏.当前的编译器实现不验证定义是否与文件匹配..d
.di
.d
.di