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++代码.
浙公网安备 33010602011771号