d作者同c++对接
作者:w.b.(d作者
)
多数语言可同c
对接.c++
在c
上构建.
c
互操作.
外(C){
空*分配(整);
空*释放(空*);
}
c++
对接?
序号 | 难点 |
---|---|
1 | 名字混杂 |
2 | 模板 |
3 | 匹配失败非错 |
4 | 名字空间 |
5 | 重载 |
6 | 依参查(依赖 参数的查询) |
无法想像!还有:
序号 | 难点 |
---|---|
7 | 运行时类型信息(rtti ) |
8 | 虚函数 |
9 | 异常 |
10 | 特殊成员函数 |
11 | 重载操作符 |
12 | 常 |
天哪!这怎么可能.你是要构建一个完整的c++前端
至d
.但,你还有一条路,那就是不编译c++,而是链接它
.
d
并不是模拟c++
,所以c++
有的,d
不一定有.
//d端
外(C++){
正 f(引用 符*p);
}
//应链接成
//c++端
外(C++){
正 f(符*&p);
}
两个正
不一样,d
是uint
,c++
是unsigned
,但他们都是正数
的意思.下面
为d
和c++
的等价符号对比:
D | C++ |
---|---|
符 | 符 |
字节 | 整符 |
正字节 | 正符 |
短 | 短 |
整 | 整 |
正 | 正 |
长 | 长长 |
正长 | 正长长 |
像:
外 "C++" 空 f(长 x);
这样:D
好像没有长
.
构 __c_long{
本(整 x){l=x;}
整 l;
别名 l 本;
}
未解析的常
问题.
整 常 f();
常(整)f();
//上两个的名字混杂不一样.
构布局匹配c++
.
//C++:
构 s{正 a;符 c;双精 d;};
//D:
构 s{正 a;符 c;双精 d;}
//注意,两个的正代表英文不一样,还有`c++`的`分号`.
静态成员也保持一致.构成员函数,也一样.
多态(虚函数)
,
d
类有虚函数
,对象/虚表
布局不一样,
d
支持com
接口:
导入 标.标c.窗口.com;
接口 I你好:I未知{
外(窗口)整 打印();
}
类 C你好:com对象,I你好{
H结果 打印(){
消息框(null,"你好",null,MB_OK);
}
}
或简单这样:
外(C++)类 C{
空 f(){...}
}
多继承
,没得法.
用值/引用
语义?
c++
命名空间:
名字空间 N{
名字空间 M{
空 f();
}
}
名字空间 N{//未关闭.
空 b();
}
d
的名字空间
.包括模块,构,类,插件模板
.
扩展c++
声明:
外(C++,N.M){
空 f();
}
外(C++,N){
空 b();
}
c++
模板.
序号 | 难点 |
---|---|
1 | 匹配失败非错 |
2 | 部分序 |
3 | 依赖查找 |
4 | 实例点 |
5 | 主模板 |
6 | 模板模板 |
好吓人!忽略掉所有,只是个名字混杂
问题.
//c++:
元<类 X,整 C>
构 B{
X v[C];
};
//D:
外(C++)
构 B(X,整 C){
X[C] v;
}
同样的:
//C++
元<类 T>
T f(T t){中 t;}
f(3);
//D:
外(C++)
T f(T)(T t){中 t;}
f(3);
两者的混杂名一致.
对接STL
.
我们来尝试勾挂向量<T>
标.向量!整 p;
f(p);
//调用
空 f(向量<整,标::分配器<整>>*p);
再来:
外(C++,标){
类 向量(T,A=分配器!T){
止 空 压后(引用 常 T);
}
}
外(C++,标){
构 分配器(T){
别名 size_type=大小型;
空 释放(T*p,size_type s){
(转换(__gnu_cxx.新分配器!T*)&本).释放(p,s);
}
}
}
外(C++,__gnu_cxx){
构 新分配器(T){
别名 size_type=大小型;
空 释放(T*,size_type);
}
}
剩余的最大问题
:抓C++异常
,c++异常,按值传递
,而d的异常,按引用传递
.
总结:
可以走得很远,需要在双端都有弹性,对接STL不可移植,要求专业
,不可能100%,但可追踪,比c包装器好,不再局限于已存在的c++代码
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现