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);
}

两个不一样,duint,c++unsigned,但他们都是正数的意思.下面dc++的等价符号对比:

DC++
字节整符
正字节正符
长长
正长正长长

像:

"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++代码.

posted @ 2021-01-11 22:22  zjh6  阅读(15)  评论(0)    收藏  举报  来源